javascript - 当 app.use 使用导入的中间件功能时,express.js api 请求挂起

标签 javascript node.js express routes es6-modules

我正在尝试使用 express.js 创建一个简单的 rest api。我正在使用 babel,所以我可以使用 es6 语法。最初我在 server.js 中有我的路由逻辑并且一切正常。我想重组我的路线并将它们放入外部文件,然后将它们导入我的 server.js。我在导入后使用 app.use('/', routes) 在 server.js 中运行它们。我无法让它工作。当我在 postman 中检查路线时,它就挂了。我花了很多时间在 stackoverflow 上并阅读其他文章,试图找出如何在我的 server.js 文件中导入和使用外部文件。看起来应该很简单,但我无法让它工作。另外,在我切换到 babel 之前,我尝试用 require() 和 exports.module 做同样的事情,但它仍然没有用。

服务器.js

我想从此处的 routes/index.js 文件中导入我的路线,并使用 app.use('/', routes); 文件调用它。

/*
 Name: server.js
 Notes: file that starts backend.
*/

//Imports
import express from 'express';
import * as bodyParser from 'body-parser';
import routes from './routes/index';

//Init Express
const app = express();

//Set Port Number
const port = process.env.PORT || 5000;

//Parses json
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

//  Connect all our routes to our application
app.use('/', routes);


//Spins up Node Server
app.listen(port, () => {
  console.log(`Listening on port ${port} `);
});

索引.js

我想从这里 routes/index.js 导出我的路由函数。

/*
  Name: index.js
  Notes: export routes function here
*/

import express from 'express';
const app = express();

function routes(){
    app.get('/test', function(req, res,next) {
        res.status(200).json({ message: 'Connected!' });
   });
}


export default routes

文件夹结构

这是我所涉及文件的文件夹结构。

server.js
|
routes
     |
     index.js

最佳答案

这里有几处错误。

首先,app.use('/', routes); 是错误的。您定义 route 的方式,它只是一个普通函数(不是中间件),您可以将其作为常规函数调用,以便它随后使用 app.get() 注册您的路由

其次,您正在创建两个单独的 app 对象,而 index.js 中的对象未连接到正在运行的服务器,因此它什么都不做。

将路由封装在单独的文件中的通常方法是使用路由器。

/*
  Name: index.js
  Notes: export router here
*/

import express from 'express';
const router = express.Router();

router.get('/test', function(req, res,next) {
    res.status(200).json({ message: 'Connected!' });
});


export default router

然后修改 server.js 以使用该路由器,只需更改名称以匹配并将路由器挂接到应用程序中 app.use(router):

*
 Name: server.js
 Notes: file that starts backend.
*/

//Imports
import express from 'express';
import * as bodyParser from 'body-parser';
import router from './routes/index';

//Init Express
const app = express();

//Set Port Number
const port = process.env.PORT || 5000;

//Parses json
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

//  Connect all our routes to our application
app.use(router);


//Spins up Node Server
app.listen(port, () => {
  console.log(`Listening on port ${port} `);
});

如果您不想使用单独的路由器(不知道为什么),那么您可以将 app 对象传递给 router() 函数,然后只将其作为普通函数调用。

/*
 Name: server.js
 Notes: file that starts backend.
*/

//Imports
import express from 'express';
import * as bodyParser from 'body-parser';
import routes from './routes/index';

//Init Express
const app = express();

//Set Port Number
const port = process.env.PORT || 5000;

//Parses json
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

//  Connect all our routes to our application
routes(app);


//Spins up Node Server
app.listen(port, () => {
  console.log(`Listening on port ${port} `);
});

/*
  Name: index.js
  Notes: export routes function here
*/

// function to initialize some routes on the pass-in app object
function routes(app){
    app.get('/test', function(req, res,next) {
        res.status(200).json({ message: 'Connected!' });
   });
}


export default routes

关于javascript - 当 app.use 使用导入的中间件功能时,express.js api 请求挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56810925/

相关文章:

javascript - 如何在 ejs 脚本部分使用后端变量?

javascript - 使用javascript删除字符串中最后出现的逗号

node.js - CheerioJS,通过具有相同类名的 <ul> 循环

node.js - 如何将 Ember 包含到现有的 Node/Express.js 应用程序中

authentication - express-jwt与jsonwebtoken

javascript - 从 Nodejs 中的请求中提取 POST 参数

javascript - 一起使用 <a href> 链接和 <onclick> 功能

javascript - 这个简单的 JavaScript 在做什么

javascript - jQuery 自动完成从数据库检索数据

mysql - 性能套接字 nodejs + mysql