【发布时间】:2016-12-22 01:18:03
【问题描述】:
我正在编写我的第一个“solo”nodejs webapp。它基于以前的应用程序(我通过遵循某种教程/课程进行编码),这是一个 Express REST API,允许您添加/删除/更新/列出待办事项列表。我还使用 jwt/bcrypt 实现了用户身份验证。所有这些都存储在 MongoDB 数据库中。
另请注意,所有端点都返回 JSON。
我现在正在尝试向应用程序添加前端。 API 端点位于 /api/endpoint1、/api/endpoint2 等处,视图呈现在 /view1、/view2 等处。我这样做是故意的,以便可以从API,或在呈现的网页中显示。
我开始使用 jQuery 的 ajax 进行调用,但我意识到这不是我想要的方式。我删除了网页上的所有 js 脚本,并开始直接在服务器上工作,使用从 api 获取的信息渲染页面。
这就是我现在拥有的:
server.js(主文件)[示例]
// RENDER 'GET TODOs'
app.get('/todos', authenticate, (req, res) => {
let auth = req.cookies['x-auth'];
request({
url: 'http://localhost:3000/api/todos',
headers: {
'x-auth': auth
}
}, function (error, response, body) {
if (error || response.statusCode !== 200) {
return res.status(response.statusCode || 500).send('Error'); // TODO
}
let bodyJSON = JSON.parse(body);
res.render('todos', {
title: 'Todo App - Todos',
todos: bodyJSON.todos
});
});
});
// API endpoint to 'GET TODOs' (JSON)
app.get('/api/todos', authenticate, (req, res) => {
Todo.find({
_creator: req.user._id
}).then((todos) => {
res.send({todos});
}, (err) => {
res.status(400).send(err);
});
});
我不知道为什么,但这一切对我来说都很奇怪。我想知道这是否是我应该这样做的方式。我的意思是,这是制作 API+前端节点应用程序的好方法/做法吗?
另外,我使用了两次身份验证中间件:在视图中和 API 本身中。我想这样可以吗?
使用 React/Angular 可能会更好,但这是一个如此小的应用程序,我只想制作一个非常简单的前端。
【问题讨论】:
-
如果需要,您可以避免使用两次身份验证中间件。如果你想验证所有 api 调用,你可以做
app.use('/api', authenticate); -
并非所有端点都需要身份验证。例如,/api/login。当我说我两次使用相同的身份验证中间件时,是因为我在前端客户端视图和 api 本身上都检查身份验证。因此,如果您使用网站路径 /todos,您需要登录(又名 x-auth cookie)。如果您尝试通过访问 /api/todos 从 api 获取 json 数据,您还需要登录(又名 x-auth 标头)