注意:结果我的问题不是middlware express.static(),而是app.use()和app.get()之间的区别.这个问题完美地回答了它(比明确的API文档更好!):
express.js中app.use和app.get之间的区别
我理解app.use('/')和app.get('/')之间的区别在于后者仅向该端点提供HTTP GET请求,而前者提供对该端点的所有HTTP请求.
我也理解express.static中间件提供从目录路径到端点的静态页面.
我不遵循的是为什么:
app.get('/', express.static(__dirname + '/public')
Run Code Online (Sandbox Code Playgroud)
仅提供所请求的第一页,而不是所请求页面引用的任何ref =或src = link/script页面.例如,这里有两个摩根跟踪响应一个简单的index.html页面,该页面有一个到文件'style.css'的css链接
1)使用app.use('/')跟踪服务器请求
Server listening on 0.0.0.0:8080
GET / 200 6.258 ms - 444
GET /style.css 304 2.842 ms - -
Run Code Online (Sandbox Code Playgroud)
2)使用app.get('/')跟踪服务器请求
Server listening on 0.0.0.0:8080
GET / 304 5.131 ms - -
GET /style.css 404 2.990 ms - 22
Run Code Online (Sandbox Code Playgroud)
404 ???
即使浏览器向'/'发送了GET请求,app.get('/')也无法为css提供服务,但是app.use('/')成功了.
app.get('/')或express.static我缺少什么细节?
在此先感谢,PT
这是简单,简单的代码:
app.js:
var morgan = require('morgan'),
express = require('express'),
app = express(),
server = require('http').Server(app);
app.use(morgan('dev'));
// Uncomment .get or .use, but …Run Code Online (Sandbox Code Playgroud) 经过大量的谷歌搜索,我找不到一个明确的例子,如何避免编程每个捕获,以确定Promise拒绝错误是程序化还是可操作的.将此与提供回调的节点回调模式(error,params ...)进行比较,其中在error参数中干净地提供操作错误,并且通过throw链处理编程错误.
请告诉我,我正在犯一个noob错误,这是我错过的一个简单的答案.
EDIT Node v10.0.0现在通过添加错误代码解决了这个问题.
感谢RisingStack将此信息发送到我的收件箱:
https://blog.risingstack.com/node-js-10-lts-feature-breakdown
......而且正式而且简洁(一如既往):
https://nodejs.org/api/errors.html#errors_error_code
考虑一个常见的例子:
function logMeIn (email, password, login_token) {
selectFromDbByEmailAndCheckPwAndReturnId (email, password)
.then(id => { return updateUserIdLoginToken(id, login_token); })
.catch(error => {
// all rejects and throws end up here
console.log(error);
})
})
function selectFromDbByEmailAndCheckPwAndReturnId (email, password) {
return new Promise((resolve, reject) => {
db.sql.query( /* params */, (error, results) => {
blarg = 1; // <-- reference error, programmatic
// do your SELECT * FROM Users where email=? ... etc.
if …Run Code Online (Sandbox Code Playgroud) 我一直在学习 Node (7.4.0) 中的 ES6 Promise,因为我想应用它们来处理串行通信。我做出了一个承诺,它是许多较小承诺的集合,允许我使用发送者、事件监听器和超时来序列化与设备的通信。但是,我不太理解 .then() 链接,因为我需要添加一些额外的闭包,这些闭包看起来与我在许多示例中看到的不同,这让我相信我误解了一些基本的东西。考虑这个函数(我删除了所有的prototype/this.code以使其更小):
function sendAck(command, ack, timeout) {
return new Promise((resolve, reject) => {
if (gReady === undefined) reject('not ready');
// each of these three functions returns a promise
let sendPromise = createSend(command);
let ackPromise = createAck(ack);
let timeoutPromise = createTimeout(timeout);
// p1 = we hear a response, or timeout waiting for one
let p1 = Promise.race([ackPromise, timeoutPromise]);
// both p1 -and- send function need to resolve
let p2 = Promise.all([p1, sendPromise]);
p2.then(values => resolve(values)).catch(err …Run Code Online (Sandbox Code Playgroud)