【问题标题】:Node Express API + Front-EndNode Express API + 前端
【发布时间】: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 标头)

标签: node.js rest api express


【解决方案1】:

保持简单。

如果您使用服务器端 HTML 渲染,则不需要 REST API,只需删除它即可。如果是 ajax 前端或移动应用程序,您需要一个 API。

如果您需要一种组合方法(服务器端渲染 + 移动应用程序或带有一些 ajax 的服务器端渲染),首先您需要将数据库查询代码隔离到一个单独的模块中(这实际上总是一个好主意)并直接从您的 API 和您的视图中使用该模块,避免从服务器端视图中使用 API。

这样您将消除过多的身份验证并使调试变得更加容易,您的代码也将变得更干净,因此更易于维护。

另外,React 并不复杂,我肯定会试一试 :)

【讨论】:

  • 我会看看 React 但我之前想学习 nodejs。
  • 如果我打开 API 以进行外部访问,我需要它返回 JSON。在这种情况下,我需要前端从该 API 中获取数据。我从您的评论中了解到,在这种情况下,Id 将 API 与前端应用程序分开。我说的对吗?
  • 我知道我可以直接从 api 路由进行渲染,这会使事情变得简单,但这是练习我的 nodejs/express 技能的一种方式。我仍然需要使用路由,重构项目结构(例如使用控制器),以及更多的事情。在我转向 React 之前,我想这样做。我可以使用样板并对其进行编辑,但我觉得这样我学得更好。
  • @nip 好吧,如果您知道自己在做一件奇怪的事情,并且故意这样做,而您看到了更正确的方法,那么真正的问题是什么?
  • 我没有关注。我将尝试更好地解释:我想要: 1. 制作一个以 json 响应的 API(因此任何用户都可以对信息做任何他们想做的事情(例如:在应用程序中、在他们的网站上使用它等等......) . 2. 为那个 api 做一个前端。对于这种情况,正确的方法是什么? 1. 在 nodejs 应用程序上制作 API(仅此而已); 2. 在另一个 nodejs 应用程序上制作前端; ?
猜你喜欢
  • 2020-12-22
  • 2018-11-09
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 2020-09-21
相关资源
最近更新 更多