Итак, я запускаю сценарий следующим образом
const db = require("../config/database");
const mongoose = require("mongoose");
const UserSettings = require("../models/userSettings");
const Users = require("../models/users");
// code runs which connects to the db
// assume the models are set up fine and properly linked
Users.create({
userName: account.userName
}, (error, user) => {
if (error) {
console.error(`Could not create user with error: ${user}`);
}
else {
console.info(`User created ${user}`);
}
UserSettings.create({
user: user
}, (error, userSetting) => {
if (error) {
console.error(`UserSettings not created for ${user.userName} : ${error}`);
}
else {
console.info(`settings! ${userSetting}`);
}
});
});
Я запускаю этот код, затем перехожу к своему терминалу и проверяю сам mongo, у меня создана только коллекция пользователей, а не коллекция usersSetting
Я просто запутался, потому что afaik, оба пользователя + userSettings настроены одинаково, поэтому я не уверен, почему коллекция userSetting не создается :(.
Заранее спасибо!
Обновлено: вот 2 схемы по запросу (немного обрезаны, чтобы легче было вписаться)
Users.js как моя модель
const mongoose = require("mongoose");
const bcrypt = require("bcrypt-nodejs");
const _ = require("lodash");
const generator = require("../security/generator");
const address = require("./address");
const Schema = mongoose.Schema;
const UsersSchema = new Schema({
userName: {
type: String,
unique: true,
trim: true,
required: true
},
email: {
type: String,
trim: true,
lowercase: true,
unique: true,
required: true,
match: [/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/, "Please fill a valid email address"]
},
password: {
type: String,
required: true
}
});
UsersSchema.methods.isPasswordValid = function(password) {
console.info("Comparing passwords");
return bcrypt.compareSync(password, this.password);
};
UsersSchema.methods.toJSON = function() {
let obj = this.toObject();
delete obj.password;
return obj;
};
UsersSchema.pre("save", function(next) {
let user = this;
console.info("----------");
console.info(user);
if (_.isEmpty(user) || !user.isModified("password")) {
return next();
}
user.password = generator.salt(user.password);
next();
});
const Users = mongoose.model("users", UsersSchema);
module.exports = Users;
UserSettings.js из моделей
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const UserSettingsSchema = new Schema({
user: {
type: Schema.Types.ObjectId,
ref: "users",
required: true,
unique: true
},
useMetricMeasurements: {
type: Boolean,
default: false
},
locale: { //tan: make this a enum
type: String,
default: "en-US"
}
});
UserSettingsSchema.pre("save",function(next){
next();
});
const UserSettings = mongoose.model("userSettings", UserSettingsSchema);
module.exports = UserSettings;
Я немного обрезал оба файла, потому что полагал, что другие поля просто будут отвлекать.
Можете выложить схему userSettings и user?
Нет журналов консоли @Graciano
Я поместил урезанную версию схем @Sridhar, поля, которые я очищал, были настроены так же, как и другие поля, только в основном с другими именами.
@DanTan Ваш фрагмент кода отлично работает для меня, создавая документ в обеих коллекциях. Может проблема в каких-то других полях?





Я считаю, что ваша проблема в том, что Mongoose асинхронный. Таким образом, при вызове UserSettings.create () пользователь может не сохраняться. Попробуйте переместить код вставки сразу после
console.info(`User created ${user}`);
Я попытался поместить это в инструкцию else после этой строки. К сожалению, он отреагировал так же :(. Ни сообщений об ошибках консоли, ни каких-либо пользовательских настроек не было создано :(
Может быть, что-то связано с какой-то собственностью. Попробуйте установить пользователя только с установленным _id и запустите свой код.
Ваша консоль регистрирует что-нибудь, это оба вызова?