在 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