为什么node.js找不到我的HTML页面

时间:2016-04-12 19:54:45

标签: javascript node.js

我有一个测试目录 C:\ node_samples \ hello_express 设置:

enter image description here

我在测试目录中有一个 package.json 文件:

Ext.application({
  name: 'TimeApp',
  autoCreateViewport: false,
  launch: function() {
    Ext.create('Ext.container.Viewport', {
      layout: 'fit',
      items: [{
        xtype: 'form',
        title: 'Date-Field 24th Hour Example',
        bodyPadding: 12,
        items: [{
          xtype: 'timefield',
          width: 220,
          name: 'time',
          fieldLabel: 'Time',
          // ====================== // Begin custom options.
          format: 'H:i',            // Important
          emptyText : '12:00',      // Why not?
          increment: 15,            // Default value
          listConfig : {
            maxHeight: 160          // Limit rows to 5 (~32px each row)
          }
        }]
      }]
    });
  }
});

我已将 node.js express 强大的正确安装在../node_modules子目录中(至少成功报告了通过从测试目录运行此命令来安装。):

{
  "name": "hello_express",
  "version": "0.0.0",
  "description": "A simple web site",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Pieter Geerkens",
  "license": "MIT",
  "private": true,
  "dependencies": {
    "express": "4.13.4",
    "formidable":  "1.x"
  }
}

我有一个位于测试目录中的 app.js 文件:

npm install 

我打开命令提示符并运行 node app ,如下所示:

enter image description here

但是,当我尝试通过导航到以下任一项来运行测试时:

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

app.use('/forms', express.static(__dirname + '/public'));

app.post('/SubmitHelloPost', function (request, response) {
   if (request.method.toLowerCase() == 'post') {
      // parse form data
      var form = new formidable.IncomingForm();
      form.parse(request, function (err, fields) {
         response.writeHead(200, { 'Content-Type': 'text/html' });
         response.write('Hello ' + fields.userName + '!<br />');
         response.end('Have a POST great day!');
         console.log('Handled POST request from ' + fields.userName);
      });
   }
});

app.get('/SubmitHello', function (request, response) {
   response.writeHead(200, { 'Content-Type': 'text/html' });
   response.write('Hello ' + request.query.userName + '!<br />');
   response.end('Have a great day!');
   console.log('Handled GET request from ' + request.query.userName);
});

var port = 8081;
app.listen(port);
console.log('Listening on port: ' + port);

我收到错误404.

html文件是( HelloForm.html ):

http://localhost:8081/HelloForm.html
http://localhost:8081/HelloPost.html

和(HelloPost.html *):

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   <title></title>
   <meta charset="utf-8" />
</head>
<body>
   <form method="get" action="/SubmitHello">
      Enter Name: <input type="text" name="userName" autofocus />
      <input type="submit" value="Submit" />
   </form>
</body>
</html>

我不知道出了什么问题。在我第一次设置之后,一切都工作了,然后停止了工作。

3 个答案:

答案 0 :(得分:3)

我认为您的问题是由以下行引起的:

app.use('/forms', express.static(__dirname + '/public'));

这告诉Express,当它收到以/forms开头的请求时,它应该将这些请求映射到/public文件夹中的静态文件。从您的目录结构来看,我认为这就是您要做的事情:

app.use('/', express.static(__dirname));

(将静态文件移动到一个单独的目录仍然是一个好主意。现在,导航到http://localhost:8081/app.js将返回原始服务器端代码,您可能不希望从中读取你的客户端代码。)

答案 1 :(得分:3)

您应该为这些文件创建一个目录(对于此示例,我将使用&#39; public&#39;)。然后将要提供的文件移动到它,然后更改

app.use('/forms', express.static(__dirname + '/public'));

app.use('/', express.static(__dirname + '/public'));

第一个参数是客户端访问文件的服务器目录,您希望它们是根目录(即&#39; /&#39;),第二个参数是文件存储的位置。通常,您不希望将公共内容(如html)与私人内容(如服务器逻辑)混合在一起,因此您将其放在单独的文件夹中,仅提供该内容。

答案 2 :(得分:2)

看起来至少有两个问题。

问题#1

您已将静态资产目录安装在/forms路径上,这意味着您要检索的所有静态资产都会在http://localhost:8081/forms/SomeFileName找到。您正试图直接在http://localhost:8081/HelloForm.html找到它们,但这不会起作用。如果你想完全摆脱路径的/forms部分,那么你可以完全从静态资产声明中删除路径参数:

app.use(express.static(__dirname + '/public'));

问题#2

无论如何,您还没有在公共目录中拥有这些文件。他们只是坐在你的根目录中。相反,您希望它们位于名为public的文件夹中,以便您的静态资产声明可以找到它们。这就是为什么它中包含单词public的原因,如下所示:

app.use('/forms', express.static(__dirname + '/public'));

因此,在根目录中创建一个名为public的文件夹,并将这些文件(HelloForm.html和HelloPost.html)移到那里。

以下是Express docs on static file serving,它会更详细地向您展示它的工作原理。

然而,我猜测即使这可以显示这两个文件,这可能不是你最终想要做的。我的猜测是你想要使用你已定义的2条路线来显示这2页。我的建议是阅读using a View Engine like EJS以呈现动态观看,并阅读RESTful routing以确定如何为路线命名。