"TypeError: undefined is not a function"。初学者,需要思路建议。 app.set('port', port)

17

我是一名业余学习使用node.js构建应用的人。我一直在跟随教程创建我的第一个node.js应用程序。一切都很顺利,直到我输入了“npm start”命令。日志显示:

C:\node\nodeteest3\bin\www:16
TypeError: undefined is not a function
    at Object.<anonymous> M+<C;\node\nodetest3\bin\www:16:5
    at Module_compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.module.runMain (module.js:501:10)
    at startup(node.js:129:16)
    at node.js:814:3

然后它输出了大约20行以“npm ERR!” +文件路径开头的内容,我认为这些内容不是必要的,因为错误似乎出现在二进制文件中。代码如下:

#!/usr/bin/env node
/**
* Module dependencies.
*/

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

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

var port = normalizePort(process.env.PORT || '3000');

这就是错误的指向位置:

[app.set('port', port);]

-------^在字母's'处的错误指针-所以设置明显-------------

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);
}

Like I said in the beginning, I'm a complete beginner with command-line/github, but I'm already in love with it. I try to practice it every night after I finish my homework, and am getting really frustrated about getting stuck because I haven't been able to move forward for four days now. Also, I'm running this on node.js and the OS is Windows 8. Anything helps!  Let me know if you want me to post any of the other code; I omitted so as to not add more than necessary.

 "../app (app.js file) JUST ADDED"***************************
../app file:
    [ App.js   ]
 var express = require('express');
 var path = require('path');
 var favicon = require('serve-favicon');
 var logger = require('morgan');
 var cookieParser = require('cookie-parser');
 var bodyParser = require('body-parser'); 

var routes = require('./routes/index');
var users = require('./routes/users');
var app = express();

///  catch 404 and forwarding to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});
var app = express();
// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
        app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}


var app = express();


// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json({estended: true}));
app.use(bodyParser.urlencoded({extended: true}));
app.use(cookieParser({extended:true}));
app.use(express.static(path.join(__dirname, 'public')));

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





//  production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});

1
你导入的变量 app 是从文件 ../app 中获取的,请问该文件的内容是什么?请检查是否正确地在 ../app 文件中使用了 module.exports 导出了 express 应用程序。看起来 node 并没有将 app 变量视为 express 应用程序的实例。 - Deepal
@deepal 这是我的app.js页面 ------------------------------------------ - alexcarll
@deepal 看起来好像可以工作了!我已经将它连接到300端口,当我连接到该页面时,会出现“未找到404错误”的提示。这意味着我至少已经成功地... - alexcarll
我已经连接上了,对吧?抱歉,我不小心按下了回车键。等我拿到错误评论后再发布。 - alexcarll
6个回答

39

你在app.js中没有导出任何内容。在app.js文件的末尾,添加以下代码:

module.exports = app;

看看你的问题是否解决。

另外还有一点需要补充:在你的app.js文件中重复出现了var app = express();


总是这样的:') - James111

3

您在app.js文件中没有声明任何名为set的函数。 请创建该函数并像这样导出:

exports.set = function(...) { ... };

如果这个app是用express创建的,你可以像这样指定端口:

var express = require('express'),
    http = require('http');

var app = express();

http.createServer(app).listen(port);

替代

app.set('port', port);
 /**
 * Create HTTP server.
 */

var server = http.createServer(app);

这是因为端口是http服务器的属性而不是express应用程序的属性。您也可以使用:
var express = require('express'),
    app = express();

app.listen(port);

@fuelusumar 所以:var server = createServer(app);? - alexcarll
@fuelusumar 明白了!谢谢!这几天一直让我疯狂! - alexcarll
var server = createServer(app).port(port); 变量server创建了一个服务器,该服务器使用app作为参数,并监听指定的端口号。 - fuelusumar
1
你可以使用 app.listen(port);。 - fuelusumar

3

不要使用 export,而是在脚本结尾处使用 module.exports。

exports = app;
module.exports = app;


1
在你的 app.js 文件底部:
app.set('port', process.env.PORT || 26398); //<--- replace with your port number

// Server
var server = http.createServer(app);
server.listen(app.get('port'), function(){
    console.log('Express server listening on port ' + app.get('port'));
});

module.exports = app;

1
在app.js文件中添加"module.exports=app;"即可。

1
在我的情况下,我只是将 normalizePort 函数移动到调用函数之前。这是在 coffeescript 中,但我已经在这里转换成了 javascript。
normalizePort = function(val) {
  var port;
  var port;
  port = parseInt(val, 10);
  if (isNaN(port)) {
    return val;
  }
  if (port >= 0) {
    return port;
  }
  return false;
};

port = normalizePort(process.env.PORT || '4000');

感谢您的帮助。我知道我花了很长时间才回来,但现在我在我的IT工作上有很多时间。所以这看起来完美无缺。非常感谢,Loubot! - alexcarll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接