이 장에서는 nodejs: express 학습에 대한 소개와 기본 지식을 소개합니다. 그렇다면 Express란 무엇일까요? Express는 최소한의 기능을 갖춘 웹 개발 프레임워크이며 완전히 라우팅과 미들웨어로 구성되어 있습니다. 기본적으로 Express 애플리케이션은 다양한 미들웨어를 호출합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
초기화
새 디렉토리 생성 myapp, 프로젝트 초기화
$ npm init
Express 설치
$ npm install express --save
Hello World 인스턴스 만들기
myapp 디렉토리에 들어가서 app이라는 파일을 만듭니다. .js
var express = require('express'); var app = express(); app.get('/', function(req, res) { res.send('Hello World!'); }); var server = app.listen(3000, function() { var host = server.address().address; var port = server.address().port; console.log('Example app listening at http://%s:%s', host, port); });
위 코드는 서비스를 시작하고 포트 3000에서 들어오는 모든 연결 요청을 수신합니다. 모든 (/) URL 또는 경로에 "Hello World!" 문자열을 반환합니다. 다른 모든 경로는 404 Not Found를 반환합니다.
다음 명령줄을 통해 시작합니다. 애플리케이션 빌더 도구 익스프레스는 애플리케이션 뼈대를 빠르게 생성할 수 있습니다.
1. 다음 명령을 설치합니다. $ node app.js
2. 현재 디렉터리에 myapp 애플리케이션을 만들고 다음 명령을 실행합니다. $ npm install express-generator -g
Express 애플리케이션 생성기 애플리케이션은 일반적으로 다음과 같은 디렉토리 구조를 갖습니다. 이는 URI(또는 경로)와 특정 HTTP 메서드(GET, POST 등)로 구성되며, 여기에는 애플리케이션이 특정 웹 사이트 노드에 대한 클라이언트 액세스에 응답하는 방법이 포함됩니다. 각 경로에는 하나 이상의 프로세서 기능이 있을 수 있습니다. 경로가 일치하면 이러한 기능이 실행됩니다.
라우팅 정의는 app.METHOD(PATH, HANDLER) 구조로 구성됩니다. 그 중 app은 express 인스턴스이고, METHOD는 HTTP 요청 메서드 중 하나이고, PATH는 서버 측 경로이고, HANDLER는 경로가 일치할 때 실행되어야 하는 함수입니다.
다음은 몇 가지 일반적인 라우팅 코드입니다.
$ express myapp $ cd myapp $ npm install> set DEBUG=myapp & npm start
문자열 패턴을 사용한 라우팅 경로의 예: 문자 ?, +, * 및 ()는 정규 표현식의 하위 집합입니다. 및 .는 문자열 기반 경로에서 문자 그대로 해석됩니다.
├── app.js ├── bin │ └── www ├── package.json ├── public │ ├── images │ ├── javascripts │ └── stylesheets │ └── style.css ├── routes │ ├── index.js │ └── users.js └── views ├── error.jade ├── index.jade └── layout.jade 7 directories, 9 files
라우팅 핸들미들웨어처럼 동작하는 요청 처리를 위한 여러 콜백 기능을 제공할 수 있습니다. 유일한 차이점은 이러한 콜백 함수가 next('route') 메서드를 호출하고 다른 경로 콜백 함수를 건너뛸 수 있다는 것입니다.
Route 핸들은 다양한 형태로 제공되며 아래와 같이 함수, 함수 배열 또는 두 가지의 혼합일 수 있습니다.
var express = require('express'); var app = express(); // respond with "hello world" when a GET request is made to the homepage app.get('/', function(req, res) { res.send('hello world'); }); // POST method route app.post('/', function (req, res) { res.send('POST request to the homepage'); }); //app.all() 是一个特殊的路由方法,没有任何 HTTP 方法与其对应,它的作用是对于一个路径上的所有请求加载中间件。 app.all('/secret', function (req, res, next) { console.log('Accessing the secret section ...'); next(); // pass control to the next handler });#🎜🎜 #Response method 다음 표의 응답 객체(res)의 메소드는 클라이언트에 응답을 반환하여 요청-응답 주기를 종료합니다. 경로 핸들에서 메서드가 호출되지 않으면 클라이언트의 요청이 중단됩니다.
방법 설명: res.download()는 파일을 다운로드하라는 메시지를 표시합니다. res.end()는 응답 처리 프로세스를 종료합니다. res.JSON()은 JSON 형식으로 응답을 보냅니다.
res.jsonp()는 JSONP를 지원하는 JSON 형식으로 응답을 보냅니다.res.redirect()는 요청을 리디렉션합니다.
res.render()는 뷰 템플릿을 렌더링합니다.res.send()는 다양한 유형의 응답을 보냅니다.
res.sendFile은 파일을 옥텟 스트림으로 보냅니다.res.sendStatus()는 응답 상태 코드를 설정하고 이를 응답 본문의 일부로 문자열로 보냅니다. app.route()
app.route()를 사용하여 체인을 만들 수 있습니다. 라우팅 경로 라우팅 핸들. 경로가 한 곳에서 지정되므로 이렇게 하면 모듈식 라우팅을 생성하는 데 도움이 되고 코드 중복과 오타가 줄어듭니다.
// 匹配 acd 和 abcd app.get('/ab?cd', function(req, res) { res.send('ab?cd'); }); // 匹配 abcd、abbcd、abbbcd等 app.get('/ab+cd', function(req, res) { res.send('ab+cd'); }); // 匹配 abcd、abxcd、abRABDOMcd、ab123cd等 app.get('/ab*cd', function(req, res) { res.send('ab*cd'); }); // 匹配 /abe 和 /abcde app.get('/ab(cd)?e', function(req, res) { res.send('ab(cd)?e'); }); //使用正则表达式的路由路径示例: // 匹配任何路径中含有 a 的路径: app.get(/a/, function(req, res) { res.send('/a/'); }); // 匹配 butterfly、dragonfly,不匹配 butterflyman、dragonfly man等 app.get(/.*fly$/, function(req, res) { res.send('/.*fly$/'); });
//使用多个回调函数处理路由(记得指定 next 对象): app.get('/example/b', function (req, res, next) { console.log('response will be sent by the next function ...'); next(); }, function (req, res) { res.send('Hello from B!'); }); //使用回调函数数组处理路由: var cb0 = function (req, res, next) { console.log('CB0'); next(); } var cb1 = function (req, res, next) { console.log('CB1'); next(); } var cb2 = function (req, res) { res.send('Hello from C!'); } app.get('/example/c', [cb0, cb1, cb2]);그런 다음 애플리케이션에서 라우팅 모듈을 로드합니다:
app.route('/book') .get(function(req, res) { res.send('Get a random book'); }) .post(function(req, res) { res.send('Add a book'); }) .put(function(req, res) { res.send('Update the book'); });#🎜🎜 # 애플리케이션은 /birds 및 /birds/about의 요청을 처리하고 해당 경로에 지정된 timeLog 미들웨어를 호출할 수 있습니다.
Express를 사용하여 정적 파일 호스팅
Express에 내장된 Express를 통해 정적 파일을 쉽게 호스팅할 수 있습니다. .static (이미지, CSS, JavaScript 파일 등) 정적 리소스 파일에 대한 액세스를 제공하기 위해 정적 리소스 파일이 있는 디렉터리를 매개변수로 express.static 미들웨어에 전달합니다. 예를 들어 이미지, CSS 및 JavaScript 파일을 공용 디렉토리에 저장한다고 가정하면 다음을 수행할 수 있습니다.
var express = require('express'); var router = express.Router(); // 该路由使用的中间件 router.use( function timeLog(req, res, next) { console.log('Time: ', Date.now()); next(); }); // 定义网站主页的路由 router.get('/', function(req, res) { res.send('Birds home page'); }); // 定义 about 页面的路由 router.get('/about', function(req, res) { res.send('About birds'); }); module.exports = router;
이제 공용 디렉토리 아래의 파일에 액세스할 수 있습니다.
var birds = require('./birds'); ... app.use('/birds', birds);
정적 리소스가 여러 디렉터리에 저장되어 있는 경우 express.static 미들웨어를 여러 번 호출할 수 있습니다.
app.use(express.static('public')); app.use(express.static('files'));
如果你希望所有通过 express.static 访问的文件都存放在一个“虚拟(virtual)”目录(即目录根本不存在)下面,可以通过为静态资源目录指定一个挂载路径的方式来实现,如下所示:
app.use('/static', express.static('public'));
现在,你就爱可以通过带有 “/static” 前缀的地址来访问 public 目录下面的文件了。
http://localhost:3000/static/images/kitten.jpg http://localhost:3000/static/css/style.css http://localhost:3000/static/js/app.js http://localhost:3000/static/images/bg.png http://localhost:3000/static/hello.html
常见问题
如何处理 404 ?
在 Express 中,404 并不是一个错误(error)。因此,错误处理器中间件并不捕获 404。这是因为 404 只是意味着某些功能没有实现。也就是说,Express 执行了所有中间件、路由之后还是没有获取到任何输出。你所需要做的就是在其所有他中间件的后面添加一个处理 404 的中间件。如下:
app.use(function(req, res, next) { res.status(404).send('Sorry cant find that!'); });
Express 支持哪些模板引擎?
Express 支持任何符合 (path, locals, callback) 接口规范的模板引擎。
如何渲染纯 HTML 文件?
不需要!无需通过 res.render() 渲染 HTML。你可以通过 res.sendFile() 直接对外输出 HTML 文件。如果你需要对外提供的资源文件很多,可以使用 express.static() 中间件。
위 내용은 nodejs 학습: Express 입문 및 기본의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!