无法理解express.js

时间:2015-09-09 06:19:56

标签: node.js rest express

我正在尝试了解MEAN堆栈,我已经按照本教程进行了操作:

https://www.airpair.com/node.js/posts/getting-started-with-docker-for-the-nodejs-dev

本教程非常好,但在express.js方面也是基础。如果我执行<!DOCTYPE html><html><head><title>Express</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>Express</h1><p>Welcome to Express</p></body></html>,最终会得到一个响应的REST API,curl -X GET http://172.17.0.11:3000。此外,如果我使用curl -X GET http://172.17.0.11:3000/users执行:respond with a resource API响应。所有这些都是在我执行时在教程中创建的:express mynodeapp。我想让REST API响应此请求:

curl -H Content-Type: application/json -X POST -d '{username:xyz,password:xyz}' http://172.17.0.11:3000/user/add

所以我在mynodeapp目录周围搜索并修改了我的app.js文件http://pastebin.com/52TA5VZ6。我在//RED评论之间添加了内容。我还在routes目录中添加了一个文件:

[root@f271de68b259 routes]# cat user.js
var express = require('express');
var router = express.Router();

/* add user */
router.post('/user/add', function (req, res) {
  res.send('respond with a resource see http://expressjs.com/api.html#app.post.method');
});

module.exports = router;

但我得到的回应是:

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
<!DOCTYPE html><html><head><title></title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>Not Found</h1><h2>404</h2><pre>Error: Not Found
    at app.use.res.render.message (/mynodeapp/app.js:38:13)
    at Layer.handle [as handle_request] (/mynodeapp/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/mynodeapp/node_modules/express/lib/router/index.js:312:13)
    at /mynodeapp/node_modules/express/lib/router/index.js:280:7
    at Function.process_params (/mynodeapp/node_modules/express/lib/router/index.js:330:12)
    at next (/mynodeapp/node_modules/express/lib/router/index.js:271:10)
    at /mynodeapp/node_modules/express/lib/router/index.js:618:15
    at next (/mynodeapp/node_modules/express/lib/router/index.js:256:14)
    at Function.handle (/mynodeapp/node_modules/express/lib/router/index.js:176:3)
    at router (/mynodeapp/node_modules/express/lib/router/index.js:46:12)</pre></body></html>

我有点迷失在我做错的事上。任何人都可以帮助我吗? 谢谢!

更新:感谢您的所有回复。我根据您的建议将routes/user.js更改为此内容:

var express = require('express');
var router = express.Router();

/* add user */
router.post('/add', function (req, res) {
  res.send('respond with a resource see http://expressjs.com/api.html#app.post.method');
});

module.exports = router;

现在我确实得到了人们的期望,但我也收到了301消息。 以下是curl -H Content-Type: application/json -X POST -d '{username:xyz,password:xyz}' http://172.17.0.11:3000/user/add现在输出的内容:

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
respond with a resource see http://expressjs.com/api.html#app.post.method

这是预期的吗?我现在做错了什么?

谢谢!

3 个答案:

答案 0 :(得分:2)

您无需在下面的代码中将/user/添加到路由器

/* add user */
router.post('/user/add', function (req, res) {
  res.send('respond with a resource see http://expressjs.com/api.html#app.post.method');
});

因为您已在app.use('/user', user);

中指定了它

只需将其更改为

即可
/* add user */
router.post('/add', function (req, res) {
  res.send('respond with a resource see http://expressjs.com/api.html#app.post.method');
});

答案 1 :(得分:1)

因此,在您的app.js中,您已将用户路线定义为:

app.use('/user', user);

然后在您的实际路径文件(user.js)中,您已将post请求处理程序定义为:

router.post('/user/add'

这意味着,为了获得此帖子请求,您需要将请求发送到:&#39; / user / user / add&#39;。

如果这不是您想要的,请更改:

router.post('/user/add'

简单地说:

router.post('/add'

答案 2 :(得分:1)

请检查快速生成器生成的app.js。在26号线附近它应该包含这样的东西:

app.use('/users', users);

这意味着,在您的user.js文件中,路由器始终与/users前缀一起使用。因此,在定义路线时应省略/users部分:

router.post('/add', function (req, res) {
  res.send('respond with a resource see http://expressjs.com/api.html#app.post.method');
});

请注意,这会使您的API在POST /users/add处可用,其s后包含额外的user。如果您想更改此设置,您可以随时编辑app.js并在/user安装用户路由器:

app.use('/user', users);

请检查Express Router docs以了解如何在路由器下定义路由,以及如何在URL前缀下安装路由。