在 Sails.js 中使用 express 中间件来提供静态文件
Using express middleware in Sails.js to serve static files
我在 sails 0.11.0 上使用 express 中间件时遇到问题。我在 http.js 文件中尝试了以下内容。
module.exports.http = {
customMiddleware: function (app) {
console.log("middleware");
app.use('/test', express.static('****/****/*****/testProject/api/controllers' + '/public/'));
}
};
但是它不起作用,我遗漏了一些东西。
您的语法有点不对,您需要return 从提供的回调中执行。它应该看起来像 controller.action.
我包括文档中的示例,这应该对您有所帮助
/**
* HTTP Server Settings
* (sails.config.http)
*
* Configuration for the underlying HTTP server in Sails.
* Only applies to HTTP requests (not WebSockets)
*
* For more information on configuration, check out:
*/
module.exports.http = {
order: [
'startRequestTimer',
'cookieParser',
'session',
'myRequestLogger',
'bodyParser',
'handleBodyParserError',
'compress',
'methodOverride',
'poweredBy',
'$custom',
'router',
'www',
'favicon',
'404',
'500'
],
myRequestLogger: function (req, res, next) {
console.log("Requested :: ", req.method, req.url);
return next();
}
};
编辑:自从我写了这个答案后,风帆发生了变化,请看看@Meeker 的答案是否有效。
** 旧答案 **
这对我有用:
var express = require('express');
module.exports.http = {
customMiddleware: function (app) {
app.use('/', express.static(process.cwd() + '/assets/site'));
},
middleware: {
order: [
'startRequestTimer',
'cookieParser',
'customMiddleware',
'session',
'myRequestLogger',
'bodyParser',
'handleBodyParserError',
'compress',
'methodOverride',
'poweredBy',
'$custom',
'router',
'www',
'favicon',
'404',
'500'
],
这在 Sails 0.12 中对我有用。修改了 config/http.js 并添加了以下内容:
/**
* HTTP Server Settings
* (sails.config.http)
*
* Configuration for the underlying HTTP server in Sails.
* Only applies to HTTP requests (not WebSockets)
*
* For more information on configuration, check out:
* http://sailsjs.org/#!/documentation/reference/sails.config/sails.config.http.html
*/
var express = require('../node_modules/sails/node_modules/express');
module.exports.http = {
middleware: {
// middleware code here ...
},
customMiddleware: function(app){
app.use('/', express.static(process.cwd() + '/assets'));
return app.use('/bower_components', express.static(process.cwd() + '/bower_components'));
}
};
允许我在没有任何引擎的情况下执行 SPP,也不需要使用另一个 http 服务器来提供静态内容。
使用最新的 Sails (0.12),无法直接从 config/http.js
调用 express-style app.use(...)
(或作为策略),因为自定义中间件函数参数从 function (app)
到 function (req, res, next)
。这可能就是为什么这里的一些答案不适用于 Sails 0.12 的原因。
Sails 文档和迁移指南中未明确提及此更改,但以 Express documentation, we see that app.use(...)
can accept a single function (req, res, next)
argument... so my guess was to assign the parameter to app.use(...)
as a custom middleware in config/http.js
like so (using connect-history-api-fallback 为例):
// config/http.js
var history = require('connect-history-api-fallback');
module.exports.http = {
middleware: {
order: [
'startRequestTimer',
'cookieParser',
'session',
'myRequestLogger',
'bodyParser',
'handleBodyParserError',
'compress',
'methodOverride',
'poweredBy',
'$custom',
'router',
'connectHistoryApiFallback', // <==
'www',
'favicon',
'404',
'500'
],
},
// Do this instead of app.use(history())
connectHistoryApiFallback: history()
}
瞧,它很有魅力!
TL;DR 从 Sails 0.12 开始,config/http.js
中定义的自定义中间件应该是 function (req, res, next)
类型而不是 function (app)
,所以不要调用 app.use(someMiddleware)
,您应该将 someMiddleware
直接放在 sails.config.http.middleware.order
.
中
在 sails 0.12.13 function (app)
上仍然有效,只需注意放置中间件代码的位置 (config/http.js):
/**
* HTTP Server Settings
* (sails.config.http)
*/
var express = require('express')
module.exports.http = {
middleware: {
order: [
'startRequestTimer',
'cookieParser',
'session',
// 'customMiddleware', --> NOT NEEDED
'bodyParser',
'handleBodyParserError',
'compress',
'methodOverride',
'poweredBy',
'$custom',
'router',
'www',
'favicon',
'404',
'500'
],
},
customMiddleware: function (app) {
// this code will be executed only once during the application startup
app.use('/public', express.static('/etc'));
}
};
完成此操作后,您应该能够使用此 URL 访问系统中的密码文件:http://localhost:1337/public/passwd
我在 sails 0.11.0 上使用 express 中间件时遇到问题。我在 http.js 文件中尝试了以下内容。
module.exports.http = {
customMiddleware: function (app) {
console.log("middleware");
app.use('/test', express.static('****/****/*****/testProject/api/controllers' + '/public/'));
}
};
但是它不起作用,我遗漏了一些东西。
您的语法有点不对,您需要return 从提供的回调中执行。它应该看起来像 controller.action.
我包括文档中的示例,这应该对您有所帮助
/**
* HTTP Server Settings
* (sails.config.http)
*
* Configuration for the underlying HTTP server in Sails.
* Only applies to HTTP requests (not WebSockets)
*
* For more information on configuration, check out:
*/
module.exports.http = {
order: [
'startRequestTimer',
'cookieParser',
'session',
'myRequestLogger',
'bodyParser',
'handleBodyParserError',
'compress',
'methodOverride',
'poweredBy',
'$custom',
'router',
'www',
'favicon',
'404',
'500'
],
myRequestLogger: function (req, res, next) {
console.log("Requested :: ", req.method, req.url);
return next();
}
};
编辑:自从我写了这个答案后,风帆发生了变化,请看看@Meeker 的答案是否有效。
** 旧答案 **
这对我有用:
var express = require('express');
module.exports.http = {
customMiddleware: function (app) {
app.use('/', express.static(process.cwd() + '/assets/site'));
},
middleware: {
order: [
'startRequestTimer',
'cookieParser',
'customMiddleware',
'session',
'myRequestLogger',
'bodyParser',
'handleBodyParserError',
'compress',
'methodOverride',
'poweredBy',
'$custom',
'router',
'www',
'favicon',
'404',
'500'
],
这在 Sails 0.12 中对我有用。修改了 config/http.js 并添加了以下内容:
/**
* HTTP Server Settings
* (sails.config.http)
*
* Configuration for the underlying HTTP server in Sails.
* Only applies to HTTP requests (not WebSockets)
*
* For more information on configuration, check out:
* http://sailsjs.org/#!/documentation/reference/sails.config/sails.config.http.html
*/
var express = require('../node_modules/sails/node_modules/express');
module.exports.http = {
middleware: {
// middleware code here ...
},
customMiddleware: function(app){
app.use('/', express.static(process.cwd() + '/assets'));
return app.use('/bower_components', express.static(process.cwd() + '/bower_components'));
}
};
允许我在没有任何引擎的情况下执行 SPP,也不需要使用另一个 http 服务器来提供静态内容。
使用最新的 Sails (0.12),无法直接从 config/http.js
调用 express-style app.use(...)
(或作为策略),因为自定义中间件函数参数从 function (app)
到 function (req, res, next)
。这可能就是为什么这里的一些答案不适用于 Sails 0.12 的原因。
Sails 文档和迁移指南中未明确提及此更改,但以 Express documentation, we see that app.use(...)
can accept a single function (req, res, next)
argument... so my guess was to assign the parameter to app.use(...)
as a custom middleware in config/http.js
like so (using connect-history-api-fallback 为例):
// config/http.js
var history = require('connect-history-api-fallback');
module.exports.http = {
middleware: {
order: [
'startRequestTimer',
'cookieParser',
'session',
'myRequestLogger',
'bodyParser',
'handleBodyParserError',
'compress',
'methodOverride',
'poweredBy',
'$custom',
'router',
'connectHistoryApiFallback', // <==
'www',
'favicon',
'404',
'500'
],
},
// Do this instead of app.use(history())
connectHistoryApiFallback: history()
}
瞧,它很有魅力!
TL;DR 从 Sails 0.12 开始,config/http.js
中定义的自定义中间件应该是 function (req, res, next)
类型而不是 function (app)
,所以不要调用 app.use(someMiddleware)
,您应该将 someMiddleware
直接放在 sails.config.http.middleware.order
.
在 sails 0.12.13 function (app)
上仍然有效,只需注意放置中间件代码的位置 (config/http.js):
/**
* HTTP Server Settings
* (sails.config.http)
*/
var express = require('express')
module.exports.http = {
middleware: {
order: [
'startRequestTimer',
'cookieParser',
'session',
// 'customMiddleware', --> NOT NEEDED
'bodyParser',
'handleBodyParserError',
'compress',
'methodOverride',
'poweredBy',
'$custom',
'router',
'www',
'favicon',
'404',
'500'
],
},
customMiddleware: function (app) {
// this code will be executed only once during the application startup
app.use('/public', express.static('/etc'));
}
};
完成此操作后,您应该能够使用此 URL 访问系统中的密码文件:http://localhost:1337/public/passwd