app.post和app.use在节点表达中有什么不同?

时间:2014-12-16 13:07:03

标签: javascript node.js curl express

我使用命令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:意外的令牌u
      at Object.parse(native)
      在Object.app.post.res.send.error [作为句柄](/ 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)
      在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
      在Function.proto.process_params(/home/xtec/Documents/xtec-simict/sim/node_modules/express/lib/router/index.js:269:12)
      在下一个(/home/xtec/Documents/xtec-simict/sim/node_modules/express/lib/router/index.js:199:19)
      在next_layer(/home/xtec/Documents/xtec-simict/sim/node_modules/express/lib/router/route.js:77:14)
      在Object.urlencodedParser [作为句柄](/home/xtec/Documents/xtec-simict/sim/node_modules/body-parser/index.js:67:27)
      在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 个答案:

答案 0 :(得分:3)

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

有关详细信息,请参阅 - 表达官方website

例如:

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方法的详细信息,请参阅链接http://www.tutorialspoint.com/http/http_methods.htm

在你的情况下

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({         延伸:真实     在那之后调用函数

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

被调用。 bodyParser.json()和bodyParse.urlencoded({extended:true})是必需的,在被调用函数中获取body对象(req,res)

答案 1 :(得分:0)

它完全相同但是:

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

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

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

 // 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上的请求GET将引发以下内容:

- Middleware1

- Middleware2

- finalGETAction3

/ api / test1上的请求POST将引发以下内容:

- Middleware1

- Middleware2

- Middleware3

- finalPOSTAction1

/ api / test2上的请求POST将引发以下内容:

- Middleware1

- Middleware2

- Middleware4

- finalPOSTAction2