我正在尝试了解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
这是预期的吗?我现在做错了什么?
谢谢!
答案 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前缀下安装路由。