[英]Requiring a mongoose model from a file which creates the model during a series of promise.then.then chains.
不,您不是我的妻子,但可以肯定的是,我最近和您在一起的时间比她多。
无论如何,我正在将一个PHP网站转换为node.js,并迷上了创建猫鼬模式和模型的过程。 唯一奇怪的是,您需要模型才能对数据库执行任何查询。
所以我一直在var etc = require(“ ./ models / etc”);'ing我的模型在我的index.js服务器中用于app.get请求。 我对所需的数据进行建模,然后将其传递给Jade / Pug模板渲染。
之所以可以这样做是因为,在我所有的模型文件中,我都是手动创建模式的,即:先编写对象,然后用该模型创建模型,然后使用这些模式创建文档并保存。
但是,现在我有了一个产品架构/对象,该产品依赖于从shopify api获取产品,使用节点模块generate-schema从该产品中创建一个架构,然后创建模型,然后遍历shopify中的产品,创建一个每个文档都有一个新文档,并附加了一些图片网址和几个其他属性,然后保存该文档。
所有这一切都发生在一系列.then(function())中,在该序列中,对象对象通过整个链传递,并存储我需要从每个函数获取的所有变量。 然后,在该承诺链的末尾,我尝试使用module.exports = objects.variable(在这种情况下,它是猫鼬模型)。 但是因为在index.js中,当我var product = require('./ models / products')时,它是异步进行的,因此变量product只是{}而不是等待.then promise链出现然后使用该模块。出口是写在最后。
有没有一种方法可以让require(x)等待module.exports填充,或者等到整个文件运行完毕,再分配变量?
谢谢。
这是您需要的代码
var MongoClient = require('mongodb');
// mongodb = MongoClient.connect('mongodb://localhost/myleisure');
var mongoose = require('mongoose');
var fs = require('fs');
var path = require('path');
var generateSchema = require('generate-schema');
// mongoose.connect("mongodb://localhost/myleisure");
//
// var db = mongoose.connection;
var Schema = mongoose.Schema;
var shopify = require('shopify-buy');
var client = shopify.buildClient({
accessToken: 'private',
domain: 'my-leisure.myshopify.com',
appId: 'X'
});
var write = true;
//Only uncomment if you want to export hell
// module.exports = function (callback) {
client.fetchProduct('8461073805').then(function(products) {
var objects = {};
objects.schema = generateSchema.mongoose(products.attrs.variants[0]);
objects.products = products;
return objects;
})
.then(function(objects){
var productSchema = new Schema(objects.schema);
productSchema.add({
images: {type: [], default: null},
thumbnail: {type: String, default: "thumb.jpg"},
name: {type: String, default: "lettini"},
colour: {type: String, default: null},
finish: {type: String, default: null},
size: {type: String, default: null},
id: {type: String, default: objects.products.attrs.product_id},
variantId: {type: String, default: null}
});
var product = mongoose.model("product", productSchema);
product.remove({});
objects.product = product;
// callback(product)
return objects;
}).then(function(objects){
if(write)
return objects.product.remove({name: "lettini"}).then(function(){
return objects
});
}).then(function(objects){
if(write)
var productsDir = "./img/products/lettinis/400x";
var products = objects.products;
var product = objects.product;
// console.log(products.variants.length);
// console.log(i);
// console.log(schema);
// console.log(products.attrs.variants);
fs.readdir(productsDir, (err, skus) => {
skus.forEach(sku => {
for (var i = 0; i < products.variants.length - 1; i++) {
if ( products.variants[i].attrs.variant.sku === sku) {
var tempProduct = products.variants[i].attrs.variant;
var newProduct = new product(tempProduct);
fs.readdir(productsDir + "/" + sku, (err, images) => {
images.forEach(image => {
newProduct.colour = tempProduct.option_values[1].value;
newProduct.frame = tempProduct.option_values[2].value;
newProduct.size = tempProduct.option_values[0].value;
newProduct.images.push(image);
});
newProduct.save();
});
};
};
});
});
return objects
}).then(function(objects){
// console.log(objects.product);
module.exports = objects.product;
});
并且在index.js中只是
var product = require('./models/products');
console.log(product);
输出:
{}
然后,在该承诺链的末尾,我尝试使用
module.exports = objects.variable
(在这种情况下,它是猫鼬模型)。 但这是异步执行的
不要异步导出内容。 而是立即导出诺言:
module.exports = client.fetchProduct(…).then(…)
.…
.then(function(objects){
// console.log(objects.product);
return objects.product;
});
这样您就可以使用promise技术(在加载更多模块的情况下也可以使用Promise.all
东西)在index.js中等待它:
require('./models/products').then(function(product) {
console.log(product);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.