但proccess.env.SECRET
目前正在上工作
我想我的问题在这里:
userSchema.plugin(encrypt, {
secret: process.env.SECRET,
encryptedFields: ["password"],
});
app.js:
require("dotenv").config();
const express = require("express");
const bodyParser = require("body-parser");
const ejs = require("ejs");
const mongoose = require("mongoose");
const encrypt = require("mongoose-encryption");
const app = express();
app.use(express.static("public"));
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({ extended: true }));
mongoose.connect("mongodb://localhost:27017/userDB", {
useUnifiedTopology: true,
useNewUrlParser: true,
});
const userSchema = new mongoose.Schema({
email: String,
password: String,
});
//_
// encrypting password field // |
userSchema.plugin(encrypt, { // | i guess problem is here
secret: process.env.SECRET, // |
encryptedFields: ["password"], //_|
});
const User = mongoose.model("User", userSchema);
错误:
Error: Authentication code missing
at Object.schema.methods.authenticateSync (C:UsersAmirDesktopsecuritynode_modulesmongoose-encryptionlibpluginsmongoose-encryption.js:419:23)
at model.<anonymous> (C:UsersAmirDesktopsecuritynode_modulesmongoose-encryptionlibpluginsmongoose-encryption.js:239:47)
at Kareem.execPreSync (C:UsersAmirDesktopsecuritynode_moduleskareemindex.js:115:16)
at model.syncWrapper [as $__init] (C:UsersAmirDesktopsecuritynode_moduleskareemindex.js:232:12)
at model.Document.init (C:UsersAmirDesktopsecuritynode_modulesmongooselibdocument.js:513:8)
at completeOne (C:UsersAmirDesktopsecuritynode_modulesmongooselibquery.js:2853:12)
at model.Query.Query._completeOne (C:UsersAmirDesktopsecuritynode_modulesmongooselibquery.js:2094:7)
at Immediate.<anonymous> (C:UsersAmirDesktopsecuritynode_modulesmongooselibquery.js:2138:10)
at Immediate.<anonymous> (C:UsersAmirDesktopsecuritynode_modulesmquerylibutils.js:116:16)
at processImmediate (internal/timers.js:456:21)
我遇到了同样的问题,这对我来说很有效:
-
使用您的终端导航到您的数据库,使用(我可以看到您使用mongo(例如:
show dbs
、use databaseName
、show collections
、db.databaseName.find()
,然后是 -
清空你的数据库
db.databaseName.drop()
(如果它是重要的东西,那么把它放在安全的地方,这样你就可以再次使用它,如果你使用Postman,应该很容易( -
并重新创建您的数据库
您应该删除数据库中的现有文档,并使用空文档再次运行代码。
实际上,问题是您可能正在对添加加密之前存储的数据使用新的加密,而如果您对新数据进行检查,它会正常工作,因此您应该首先创建一个新数据库,以便在其中添加新项,它有望为您工作。:(
嗯,我也遇到了同样的问题,但它只发生在以前使用mongoose加密而不使用dotenv存储在数据库中的数据上。然而,它工作良好
- 当您通过注册为新用户来创建新数据时
- 删除数据库并创建一个新数据库。(请确保在执行此操作之前先保存数据(。:(
原因是您可能更改了;加密密钥";。如果您能找到一开始创建的数据库,那么您仍然可以在(.js(文件中检查并使用该数据库。然而;错误:身份验证代码丢失(Mongoose加密(";并不意味着你毁了它。你仍然可以使用。试试
是,您应该尝试删除数据库一次,然后在中启动服务器。
您可能已经更改了您的加密";秘密";在将其传输到.env文件时进行一些编码。
别忘了在丢弃之前备份。
若要修复此错误,请删除要加密的集合(使用db.<collection-name>.drop()
(,然后重新创建。
您看到此错误是因为数据库中的某些数据未加密,而其余数据已加密。
在我的案例中,错误是由findOneAndReplace
的使用触发的。如果记录已经以这种方式存在,我想替换它:
const newCredentials = { userId, securedCredentials};
await Credentials.findOneAndReplace({ userId }, newCredentials, {upsert:true});
我注意到,如果我们尝试以标准方式添加对象,代码就会起作用:
await new Credentials(newCredentials).save();
因此,问题在于,我们正试图扰乱一个未加密的对象。好的,那我们加密吧!我试着调用encrypt
方法,但不起作用
// The following line doesn't work. `encrypted` is undefined
const encrypted = await new Credentials(newCredentials).encrypt();
// This does work though...
const credentials = new Credentials(newCredentials);
credentials.encrypt((err) => {console.log(credentials)});
由于我不知道如何在原子操作中做到这一点,我只做了很长的路:
await Credentials.deleteOne({userId});
await new Credentials(newCredentials).save();
如果有人对如何使手术雾化有一个想法,那就太好了!
您的系统上没有活动的MongoDB服务器端口27017。要做到这一点,只需写";mongod";命令。