我有一个测试目录 C:\ node_samples \ hello_express 设置:
我在测试目录中有一个 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 ,如下所示:
但是,当我尝试通过导航到以下任一项来运行测试时:
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>
我不知道出了什么问题。在我第一次设置之后,一切都工作了,然后停止了工作。
答案 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)
看起来至少有两个问题。
您已将静态资产目录安装在/forms
路径上,这意味着您要检索的所有静态资产都会在http://localhost:8081/forms/SomeFileName
找到。您正试图直接在http://localhost:8081/HelloForm.html
找到它们,但这不会起作用。如果你想完全摆脱路径的/forms
部分,那么你可以完全从静态资产声明中删除路径参数:
app.use(express.static(__dirname + '/public'));
无论如何,您还没有在公共目录中拥有这些文件。他们只是坐在你的根目录中。相反,您希望它们位于名为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以确定如何为路线命名。