无法运行,Node.js,express,socket.io和ejs?

时间:2016-11-23 05:19:54

标签: javascript node.js express socket.io ejs

我正在尝试学习java脚本。我正在考虑使用Express,stock.io和ejs制作一个基本的聊天应用程序。

我无法让它运行。

这是我的app.js

var express     = require('express');
var app         = require('express')();
var http        = require('http').Server(app);
var io          = require('socket.io')(http);
var path        = require('path');
var ejs         = require('ejs');
var app         = express();

// view engine
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'viwes'));

app.get('/', function(req, res) {
    res.render('index');
});

io.on('connection', function(socket) {
    console.log('a user connected');
});

http.listen(3000, function(){
    console.log('listening on *:3000');
});

我的index.ejs

<!DOCTYPE html>
<html>
<head>
    <title>ChatApp</title>

    <link href="/css/style.css" rel="stylesheet" type="text/css" />

    <script src="/socket.io/socket.io.js"></script>
    <script>
        var socket = io();
    </script>

</head>
<body>
</body>
</html>

我的package.json

  "dependencies": {
    "express":      "4.14.0" ,
    "body-parser":  "1.15.2"  ,
    "socket.io":    "1.6.0",
    "connect":      "3.5.0",
    "ejs":          "2.5.2"
  },
  "engines": {
    "node":         "4.0.0"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/heroku/node-js-sample"
  },

现在它只是在浏览器中说:

Cannot GET /

我认为这是一个路径问题,但我知道什么......

1 个答案:

答案 0 :(得分:2)

您创建了两个不同的app变量,用另一个覆盖了一个变量,部分应用正在使用一个,而另一部分正在使用另一个变量。改变:

var express     = require('express');
var app         = require('express')();
var http        = require('http').Server(app);
var io          = require('socket.io')(http);
var path        = require('path');
var ejs         = require('ejs');
var app         = express();     // this is overwriting your app variable

来解决问题的这一部分:

var express     = require('express');
var app         = express();
var http        = require('http').Server(app);
var io          = require('socket.io')(http);
var path        = require('path');
var ejs         = require('ejs');

因为您正在创建第二个app对象并用它覆盖app变量,所以您在app对象上创建的路径根本没有连接到您的服务器。因此,您的实际服务器没有为其定义路由,似乎没有任何工作。

推荐的修补程序创建一个且只有一个app对象,代码的所有部分都使用该app个对象。

此外,似乎views拼写错误:

path.join(__dirname, 'viwes')

然后,在您的浏览器中,确保您指定端口3000,因为这是您启动服务器的端口。

仅供参考,这不是一个实际的编程错误,但我个人认为使用http作为服务器的变量名称是一个坏主意。 http模块应该使用http(您有时可能希望在应用中的其他位置使用该模块)。 require('http').Server(app);创建一个服务器对象,以便为变量命名:

var server = require('http').Server(app);

甚至更好:

var server = require('http').createServer(app);

然后,稍后:

server.listen(...);