在Node的Express框架中,app.post和app.use有什么不同?

5
我将使用命令 curl -H "Content-Type: application/json" -d '{"name":"sparc_core","port":["p1", "p2"]}' http://127.0.0.1:3000/add_module 来测试nodejs服务器。
起初,我的代码如下:
app.post('/add_module', bodyParser.json()); 
app.post('/add_module', bodyParser.urlencoded());
app.post('/add_module', function(req, res, next) {
    req.body = JSON.parse(req.body.data);
    next();
});
app.post('/add_module', function(req, res) {
    console.log("Start submitting");
    console.log(req.body);
... ...

在运行curl命令后,节点服务器输出以下错误信息:

SyntaxError: Unexpected token u
at Object.parse (native)
at Object.app.post.res.send.error [as handle] (/home/xtec/Documents/xtec-simict/sim/app.js:80:21)
at next_layer (/home/xtec/Documents/xtec-simict/sim/node_modules/express/lib/router/route.js:103:13)
at Route.dispatch (/home/xtec/Documents/xtec-simict/sim/node_modules/express/lib/router/route.js:107:5)
at /home/xtec/Documents/xtec- simict/sim/node_modules/express/lib/router/index.js:205:24
at Function.proto.process_params (/home/xtec/Documents/xtec-simict/sim/node_modules/express/lib/router/index.js:269:12)
at next (/home/xtec/Documents/xtec-simict/sim/node_modules/express/lib/router/index.js:199:19)
at next_layer (/home/xtec/Documents/xtec-simict/sim/node_modules/express/lib/router/route.js:77:14)
at Object.urlencodedParser [as handle] (/home/xtec/Documents/xtec-simict/sim/node_modules/body-parser/index.js:67:27)
at next_layer (/home/xtec/Documents/xtec-simict/sim/node_modules/express/lib/router/route.js:103:13)
POST /add_module 500 7ms - 1021b

然后,我将代码修改为如下形式:

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
}));

app.post('/add_module', function(req, res) {
    console.log("Start submitting");
    console.log(req.body);
... ...

我运行了相同的curl命令,它正常工作!

因此,我想知道app.use和app.post之间的区别。需要您的帮助,非常感谢。

2个回答

7

app.use()是用于包含中间件/拦截器函数的,这些函数将在调用API时实际函数执行之前执行。

更多详细信息,请参考Express官方网站

例如:

app.use(cors());
    app.post("/",function(req,res){
    });

以上代码行等同于:
app.post("/",cors(),function(req,res){
});

app.post、app.get、app.put和app.delete定义了API的HTTP方法。


请参考链接http://www.tutorialspoint.com/http/http_methods.htm了解更多关于HTTP方法的详细信息。

在您的情况下:

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
}));

app.post('/add_module', function(req, res) {
    console.log("Start submitting");
    console.log(req.body);
}

当调用/add_module api时,首先调用bodyParser.json()函数,然后调用bodyParser.urlencoded({extended: true})函数。

 function(req, res) {
        console.log("Start submitting");
        console.log(req.body);} 

被称为bodyParser.json()和bodyParse.urlencoded({extended:true})的方法是必需的,以便在调用的函数(req,res)中从请求中获取body对象。


4

虽然有些细微的不同:

  • 在app.use中包含的中间件将用于所有请求。

  • 在app.post("/route")中包含的中间件仅用于类型为POST且路径匹配/route的请求。

例如,如果您的服务器包含以下内容:

 // Common middleware
 app.use(function(req, res, next){
    console.log("Middleware1");
    return next();
 });
 app.use(function(req, res, next){
    console.log("Middleware2");
    return next();
 });

 // POST middleware
 app.post("/api/test1", function(req, res, next){
    console.log("Middleware3");
    return next();
 })
 app.post("/api/test2", function(req, res, next){
    console.log("Middleware4");
    return next();
 })


 // Actions
 app.post("/api/test1", function(req, res, next){
    console.log("finalPOSTAction1");
    return res.status(200).json({});
 })
 app.post("/api/test2", function(req, res, next){
   console.log("finalPOSTAction2");
   return res.status(200).json({});
 })
 app.get("/api/test3", function(req, res, next){
   console.log("finalGETAction3");
   return res.status(200).json({});
 })

对 /api/test3 发送请求时将会引发以下错误:

- Middleware1

- Middleware2

- finalGETAction3

对 /api/test1 发起 POST 请求会引发以下情况:

- Middleware1

- Middleware2

- Middleware3

- finalPOSTAction1

在/api/test2上发送POST请求会引发以下情况:

- Middleware1

- Middleware2

- Middleware4

- finalPOSTAction2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接