- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在尝试各种热重载设置,我遇到的一个是 https://github.com/glenjamin/ultimate-hot-reloading-example/ 。以修改此样板代码为起点,我在服务器代码中遇到了以下问题:
// server.js
import chokidar from 'chokidar';
import express from 'express';
const app = express();
// this is the middleware for handline all of my routes
app.use(function (req, res, next) {
require('./server/index')(req, res, next);
// if I commented out any additional routes, the setup would work fine
require('./server/foo')(req, res, next);
require('./server/catch-all')(req, res, next);
});
//this watches the server folder for changes
const watcher = chokidar.watch('./server');
watcher.on('ready', function () {
watcher.on('all', function () {
console.log("Clearing /server/ module cache from server");
Object.keys(require.cache).forEach(function (id) {
if (/[\/\\]server[\/\\]/.test(id)) delete require.cache[id];
});
});
});
app.listen(3000, 'localhost', function (err) {
if (err) throw err;
const addr = this.address();
console.log('Listening at http://%s:%d', addr.address, addr.port);
});
上面是通过监视 chokidar 模块的更改来处理清除缓存的服务器代码。如果我在 app.use 中间件函数(监听每个传入请求)中只需要一条路由,我就可以让它工作。但是如果有多个路由,则会出现以下错误:
错误 [ERR_HTTP_HEADERS_SENT]:将 header 发送到客户端后无法设置 header
这是堆栈溢出上发布的一个常见问题,但我遇到并尝试过的所有解决方案均无效。我的路线文件如下:
//index.js
import express from 'express';
const router = express.Router();
router.get('/', (req, res, next) => {
res.send("greagrehgarhegrehuh").end();
return next('router');
});
module.exports = router;
//end of index.js
//foo.js
import express from 'express';
const router = express.Router();
router.get('/foo', (req, res, next) => {
res.send("foo").end();
return next('router');
});
module.exports = router;
//end of foo.js
//catch-all.js
import express from 'express';
const router = express.Router();
router.get('*', (req, res, next) => {
res.send("catch all").end();
return next('router');
});
module.exports = router;
// end of catch-all.js
除了端点之外,所有三个路由都执行相同的操作。到目前为止,我已经明确地在每个函数上调用 end 来结束响应,使用 return next('router') 来跳过其余的中间件函数,并且也尝试在没有上述函数的情况下执行此操作。关于我在这里缺少什么来让这个工作有什么想法吗?这是一个展示该问题的 github 项目
https://github.com/RonanQuigley/express-chokidar-hot-reload
更新
所以我实际上删除了接下来的调用,并且通过执行以下操作似乎几乎已经使其正常工作:
app.use(function (req, res, next) {
require('./server/index')(req, res, next);
require('./server/foo')(req, res, next);
});
// a second app.use middleware, that does the same
// as the catch all // * router.get from my original post
app.use(function (req, res, next) {
app.get('*', (req, res) => res.send('catch all'));
})
但是,我无法将第二个 app.use 与另一个需要调用具有快速路由器的文件的文件一起使用,就像其他应用程序一样。所以看起来express通过中间件堆栈运行,到达*并尝试设置 header 两次。
我需要 * 的原因通常是,如果用户请求不存在的端点, Node 会正确显示无法获取/。然而,由于某种原因,使用我概述的设置,express 将会崩溃。我的解决方法是在中间件堆栈的末尾使用 * ,我只需使用 res.redirect 将用户发送回任何地方,但这会导致我在原始帖子中概述的上述问题。所以不知道如何解决这个问题。
所以目前我有:
1) 热重载不需要 router.get('*'),但是当用户导航到不存在的端点时,express 将崩溃。
2) 热重载与第二个 app.use 调用中的 app.get('*') 一起使用,但我无法使用路由器将其移动到单独的文件中。
最佳答案
好的,所以发布这个解决方案以供我自己将来引用,以防其他人遇到这个问题。
与 Express 开发人员交谈后,事实证明,通过以下组合确实可以实现这一点:
// you need to use comma separated routes
app.use(
dynamic('./server/index'),
dynamic('./server/foo')
);
// require the library at runtime and apply the req, res, next arguments
function dynamic(lib) {
return function (req, res, next) {
return require(lib).apply(this, arguments)
}
}
对于 webpack,这会破坏它,因为你不能使用 require 作为表达式。因此,请使用以下方法来解决这个问题:
function createRoutes(router) {
const dynamic = (lib) => {
return function (req, res, next) {
// let webpack generate a regex expression from this require
// if we don't you would get a critical dependency warning
// which would result in the routes not being found
return require("./src/" + lib + ".js").apply(this, arguments);
}
}
router.use(
dynamic('index'),
dynamic('foo'),
);
return router;
}
关于javascript - 使用多个路由时,使用express和chokidar进行热重载会导致http header 发送错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49129577/
使用弹出的 CRA,它编译成功,然后中断显示以下错误.. 当我将 npm 从 6 更新到 7 时,它开始发生 You can now view webrms in the browser. Loc
您好,我正在尝试在 Windows 上设置 chokidar。我必须使用 chokidar-cli 来工作,这是正确报告事件的命令行: chokidar "D:\PATH\**\WATCHED_FO
我只想获取文件名被更改、删除、重命名,但我得到了完整的文件路径 问题:我想要更改完整的文件名,而不是路径或在完整路径上执行字符串 这是我正在尝试的: var fileLocation = path
我需要在我的应用程序中添加对此功能的支持。我当前的实现非常简单: this.watcher.on("add", (pathName: string) => {
使用 Chokidar 查看目录时有什么方法可以忽略多个文件或目录吗? 我的代码: var ignoredFiles = ['c:/test/file1.txt', 'c:/test/file2.tx
我正在寻找使用 nodejs Chokidar 的文件夹我只想监视 xml 文件的添加、删除。我是 Chokidar 的新手,无法弄清楚。我尝试设置 Chokidar ignore 以匹配所有以 .x
说到Chokidar配置 我想设置选项。我想忽略除 xml 文件之外的所有内容。 { "path": "C:/... my path ...", "options": {
我有这个目录结构 ├── components │ ├── quarks │ │ └── index.js │ │ └── ... │ ├── bosons │ │ └
当我使用“添加”事件查看带有 Chokidar 的文件夹时,所有现有文件都列为已添加。 这是正确的行为吗? 如何防止列出现有文件并仅显示添加的文件? “更改”事件按预期工作。 var watcher
我经常遇到 npm start 的问题. 首先,似乎每次在我删除 src 中的所有内容之后文件夹我将无法运行 npm start -- 它会在启动脚本中抛出错误。 我一直在通过删除 node_modu
我在这里阅读了很多关于 chokidar 的问题和答案,但我仍然感到困惑......所以非常感谢任何可以调试我的特定代码段的人。 我在 localhost:3000 运行一个基本的 Express N
我正在使用 docker for mac 版本 1.12.0-rc2 进行 React 项目。我的工作流程是这样的: OS X 上的src/ 文件夹已挂载到容器 当开发人员修改 src/ 中的文件时,
我在服务器上有一个缓存引擎,它缓存在根目录下访问的所有文件。我正在考虑使用 Chokidar 来监视整个目录树(递归地)文件更改并相应地更新缓存。但我担心如果子目录包含数十万个文件会发生什么情况 -
大家好,当我尝试安装 react-redux 时,我不断收到以下错误 Error from chokidar (/home/lamechdesai/Projects/WebApp/JavaScript
这是一个简单的问题,而且可能是一个愚蠢的问题。我试图让 node-sass-chokidar 将 main.css 文件输出到我的 React 应用程序中的 src 中,但我只能让它输出一个 main
我用过 react-slingshot ( link ) 作为我的入门套件(使用 create-react-app 作为基础)。 最近,我在运行脚本时收到错误日志 npm start在我的项目上。我对
我有一个使用 create-react-app 创建的 react 应用程序。 为了编译 sass 文件,我使用了 docs 中推荐的 node-sass-chokidar。 . 它在我的本地机器(o
我从 Github 克隆了我已经在 Github Pages 上运行的 React-Typescript 应用程序,并希望进行一些更改。我运行 npm install 并安装了所有依赖项,但是当我运行
我正在使用天蓝色的事件目录,我得到这个奇怪的模块未找到错误,然后是一个 chokidar 错误: ./node_modules/react-aad-msal/dist/commonjs/MsalAut
在一个新的 Angular 应用程序中,我收到以下错误:Error from chokidar : Error: UNKNOWN: unknown error, watch我已经删除并重新安装 nod
我是一名优秀的程序员,十分优秀!