简体   繁体   English

在Node.js Express上使用中间件设置简单服务器时出错

[英]Error setting up simple server with middleware on node.js express

I am reasonably new to node express and am trying to set up a simple server with middleware to handle routing. 我对Node Express很陌生,并且正在尝试使用中间件设置一个简单的服务器来处理路由。 The error I'm getting is TypeError: Router.use() requires a middleware function but got a Object The error is because of the app.get('/', require(routes)); 我得到的错误是TypeError: Router.use() requires a middleware function but got a Object错误是由于app.get('/', require(routes)); line. 线。 Does anyone know what I need to put here as a middleware function? 有人知道我需要把这里作为中间件功能吗?

//server.js
http = require('http');
let port = process.env.PORT || 3000;
let host = '127.0.0.1';
var express = require('express');
var app = express();
var routes = './api/routes/positions';

app.use('/', require(routes));

http.createServer(app).listen(port);
console.log('Listening at http://' + host + ':' + port);

//#########################
//positions.js
const express = require('express');
var router = express.Router();

router.get('/', (err, req, res, next) => {
    res.status(200).json({
    message: "hello from server"
    });
});

module.exports.router;
#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('ag:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3002');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * Event listener for HTTP server "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}

You are exporting the module in wrong way from positions.js file. 您正在从positions.js文件中以错误的方式导出模块。

you need to write 你需要写

module.exports = router

instead of, 代替,

module.exports.router

What you have written will bind a new key router to exports object, but haven't assigned any value to it and hence it goes back to default the empty object {} . 您编写的内容会将一个新的密钥router绑定到exports对象,但尚未为其分配任何值,因此它将返回到默认的空对象{}

Now express was expecting a function but got object and hence the error. 现在express期望功能,但是得到了对象,因此出现了错误。 You can verify it by checking the require(routes) in server.js file. 您可以通过检查server.js文件中的require(routes)来验证它。

Update (advice) 更新(建议)

Please study this formatted version of your code. 请研究此格式的代码。

const http = require('http');
const express = require('express');

const routes = require('./api/routes/positions');

const port = process.env.PORT || 3000;
const host = '127.0.0.1';

const app = express();

app.use('/', routes);

http.createServer(app).listen(port);
console.log('Listening at http://' + host + ':' + port);

If you want to read more project, you can read this boilerplate written by me. 如果您想阅读更多项目,可以阅读我写的这个样板 It's bit old, but may serve you well. 它有点旧,但可能会为您服务。

Try this one: 试试这个:

     //server.js
        let port = process.env.PORT || 3000;
        let host = '127.0.0.1';
        var express = require('express');
    var app = express();
    var routes = require('./api/routes/positions');

    http.createServer(app).listen(port);
    console.log('Listening at http://' + host + ':' + port);

    //#########################
    //positions.js
    const express = require('express');
    var router = express.Router();
    router.use('/', routes);
   app.use('/', routes);
    router.get('/', (err, req, res, next) => {
        res.status(200).json({
        message: "hello from server"
        });
    });

    module.exports = router;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM