app.set('port',port)'TypeError:undefined不是函数'。初学者,需要创意

时间:2015-05-12 07:07:01

标签: javascript node.js npm

我是业余学习用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!”+文件路径开头,我觉得不必要,因为错误似乎在bin文件中。这个代码是

#!/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' - 关于set ------------

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

6 个答案:

答案 0 :(得分:30)

您没有在app.js文件中导出任何内容。在app.js文件末尾,包含以下行。

module.exports = app;

查看您的问题是否消失。

还有一项补充:var app = express();中有两次app.js

答案 1 :(得分:3)

对于调用导出,请使用module.export结束脚本结束。

exports = app;
module.exports = app;

答案 2 :(得分:2)

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

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

如果此app是快递app,请指定这样的端口:

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服务器的属性,而不是快速应用程序的属性

您也可以使用

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

app.listen(port);

答案 3 :(得分: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;

答案 4 :(得分: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');

答案 5 :(得分:1)

只需添加“module.exports = app;”在app.js文件中。