app.set('port', port) 'TypeError: unde

2019-03-18 10:34发布

问题:

I'm an amateur learning to build with node.js. I've been following a tutorial to create my first node.js app. It worked perfectly until I entered 'npm start'. The log is:

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

Then it output about 20 lines starting with "npm ERR! " + filepaths, that I don't think are necessary, as the error seems to be in the bin file. The code for this is

#!/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');

This is where the error points to:

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

-------^error pointer at 's'-so clearly about 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: {}
    });
});

回答1:

You are not exporting anything in the app.js file. At the end of app.js file, include following line.

module.exports = app;

See whether your problem goes away.

And one more addition: you have var app = express(); twice in your app.js.



回答2:

Intaned of calling export please use module.export end the end of your script.

exports = app;
module.exports = app;



回答3:

You don't have declared any function called set inside the app.js file. Create that function and export it like this:

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

If this app is the express app yo especify a port like this:

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

var app = express();

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

instead of

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

var server = http.createServer(app);

This is because the port is a property of the http server and not of the express app

You can use also

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

app.listen(port);


回答4:

At the bottom of your 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;


回答5:

In my case I simply moved the normalizePort function before the function was called. This was in coffeescript but I've converted it to javascript here.

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


回答6:

Just add "module.exports=app;" in the app.js file.