javascript - 无法运行 Node.js、express、socket.io 和 ejs?

标签 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 /

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

最佳答案

您创建了两个不同的 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(...);

关于javascript - 无法运行 Node.js、express、socket.io 和 ejs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40756598/

相关文章:

javascript - NodeJS 双否定三元运算符

javascript - 如何在不使用 -webkit-app-region 的情况下在 Electron 中移动无框窗口

node.js - Express.js index.js 404(未找到)

javascript - 运行应用程序时使用 multer 导致错误

javascript - 如何使用 CSS 构建此布局?

javascript - IE11 中的 pdf.js 错误,src 属性 (0x800a138f)

javascript - 如何过滤掉复杂查询中的文本字段?

node.js - 如何将中间件包装在函数中?

javascript - Webpack 2编译但不运行javascript

javascript - 如何在 react-native-document-picker 中将 PDF 转换为 base64?