>웹 프론트엔드 >JS 튜토리얼 >nodejs 학습: Express 입문 및 기본

nodejs 학습: Express 입문 및 기본

青灯夜游
青灯夜游원래의
2018-09-12 17:10:561377검색

이 장에서는 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$/');
});



express.Router



express.Router 클래스를 사용하여 모듈식 마운트 가능한 경로를 만들 수 있습니다. 핸들. 라우터 인스턴스는 완전한 미들웨어이자 라우팅 시스템이므로 종종 "미니 앱"이라고도 합니다.

앱 디렉토리에 다음 내용을 포함하는birds.js라는 파일을 생성합니다:

//使用多个回调函数处理路由(记得指定 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.