Nodemon不断重启服务器。

20

我有一个使用本地json文件作为数据库的Express服务器。我正在使用https://github.com/typicode/lowdb来进行读取和设置。

目前,服务器一直在启动和重新启动,没有任何问题,但无法访问。以下是我的Server.js文件:

import express from 'express'
import session from 'express-session'
import bodyParser from 'body-parser'
import promisify from 'es6-promisify'
import cors from 'cors'
import low from 'lowdb'
import fileAsync from 'lowdb/lib/storages/file-async'

import defaultdb from './models/Pages'

import routes from './routes/index.js'

const app = express();

const db = low('./core/db/index.json', { storage: fileAsync })

app.use(cors())

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.use('/', routes);

app.set('port', process.env.PORT || 1337);

db.defaults(defaultdb).write().then(() => {
    const server = app.listen(app.get('port'), () => {
      console.log(`Express running → PORT ${server.address().port}`);
    });
});

有人之前遇到过这样的问题吗?我认为这与这行代码有关:

db.defaults(defaultdb).write().then(() => {
    const server = app.listen(app.get('port'), () => {
      console.log(`Express running → PORT ${server.address().port}`);
    });
});
10个回答

29
从文档中可以看到,nodemon会监视nodemon启动的目录中的文件,如果有任何文件更改,nodemon将自动重新启动您的node应用程序。
如果您的数据库的 .JSON 文件在 nodemon 的监视范围内,并且您不断地对其进行编写,则服务器将在无限循环中重新启动,从而使其无法访问。尝试通过将其移动到目录外部或通过一些 nodemon 配置来将 .JSON 文件移出 nodemon 的监视范围(如果可能)。

但我并不会一直写入数据库。仅在启动时编写默认数据库。我的语法是否存在问题,导致了无限循环? - Dileet
1
当您的服务器启动时,您可能没有明确地向其编写,但是低db在服务器启动时可能会向您的.JSON文件或其他相关文件进行编写。 - Andrew Sinner
1
@Dileet 在审查代码后,似乎这行代码执行了一个写操作 db.defaults(defaultdb).write()。由于它在启动时执行,你将会遇到上述的无限循环问题。 - Andrew Sinner
好的,所以删除这个起作用了。但是我该如何设置默认的数据库? - Dileet
关键是我app.js文件中的“某些内容”在“写入”。当我将其注释掉后,问题解决了。非常感谢您提供的见解。 - klewis
谢谢。我为此进行了一个多小时的故障排除。我有一个网络爬虫脚本,我不小心将“with open…”注释掉了,因此每次运行时都会在我的根/服务器目录中创建一个新的.json文件。我没有在那里查找。#学习艰难 - amota

22

我从这个页面解决了这个问题。

实际上,你只需要做

 nodemon --ignore 'logs/*'

更新:链接已被劫持并已移除。


1
你的链接似乎已经失效了。 - humans
链接确实失效了,但我不是该页面的所有者,尽管你可以尝试使用命令nodemon --ignore 'logs/*',它可以正常工作。 - Yorsh
1
我使用 nodemon --ignore 'sessions/*' index.js,因为我的会话被写入到同一目录中的文件中。 - changokun

11

我的解决方案: 我在 package.json 文件中添加了 nodemonConfig,以停止无限循环/重启。 在 package.json 中:

"nodemonConfig": { "ext": "js", "ignore": ["*.test.ts", "db/*"], "delay": "2" },
"scripts": { "start": "nodemon" }

1
非常好。只需将其添加到 package.json 中就可以忘记它! - Matiss

7

我一直被持续的重启问题困扰。我使用 nodemon --verbose 命令查看是什么导致了重启。

这让我发现我的 package.json 文件是罪魁祸首。我把安装程序放在了 Dropbox 文件夹中,并刚刚删除了 node_modules 文件夹中所有的文件并重新安装。与我共享 Dropbox 文件夹的另一台电脑正在运行,并且在我不知情的情况下,它正在忙于更新其 node_module 文件并更新 package.json 文件的 Dropbox 复制件。

我的解决方法很简单,我休息了一会儿,等待 Dropbox 完成索引 node_modules 文件夹的过程。当 Dropbox 完成同步后,nodemon 就可以正常运行,不会有任何意外的重启了。


我使用这个来诊断问题的来源,然后使用建议修复的“--ignore”标志。 - Trevor Njeru

2
在我的情况下(与原帖作者相同),只需忽略数据库文件即可。
nodemon --ignore server/db.json server/server.js

0
将以下代码添加到你的 package.json 文件中:
"nodemonConfig": {
  "ext": "js",
  "ignore": [
      "*.test.ts",
      "db/*"
  ],
  "delay": "2"
}

0
将以下内容添加到你的 `nodemon.json` 文件中:
{
  "ignore": [
    "logs/*"
  ]
}

0

你可以使用这个通用的配置文件。 将其命名为nodemon.json,并放在项目的根目录中。

{
  "restartable": "rs",
  "ignore": [".git", "node_modules/", "dist/", "coverage/"],
  "watch": ["src/"],
  "execMap": {
    "ts": "node -r ts-node/register"
  },
  "env": {
    "NODE_ENV": "development"
  },
  "ext": "js,json,ts"
}

0

我通过向package.json文件中添加如下代码来解决了这个问题

  "nodemonConfig": {
    "ext": "js",
    "ignore": [
      "*.test.ts",
      "db/*"
    ],
    "delay": "2"
  }
}

-1
我通过在我的 package.json 中创建一个脚本来解决这个问题,代码如下:
scripts": {
    "start-continuous": "supervisor server/server.js",
},

如果您在全局范围内安装了supervisor,则此方法将有效。

npm install supervisor -g

现在我所做的只是:npm run start-continuous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接