要求在一系列promise.then.then链中创建模型的文件中的mongoose模型。

时间:2017-03-31 20:47:52

标签: javascript node.js mongodb mongoose

不,你不是我的妻子,但看来我最近和你在一起的时间比她多。

无论如何,我将php网站转换为node.js并且已经掌握了创建mongoose模式然后模型的问题。唯一奇怪的是,您需要模型才能对数据库进行任何查询。

所以我已经变成了var etc = require(" ./ models / etc");我的模型将在我的index.js服务器中用于app.get请求。我建模。找到我想要的数据并将其传递给jade / pug模板渲染。

这没关系,因为在我的所有模型文件中,我手工创建模式,即:我编写对象,然后从中创建模型,然后使用这些模式创建文档并保存它们。

但是,现在我有一个产品架构/对象,它依赖于从shopify api获取产品,使用节点模块generate-schema从该产品创建架构,然后创建模型,然后从shopify循环产品,为每个文档创建一个新文档,并附加一些图像URL和其他几个属性,然后保存文档。

这一切都发生在一系列.then(function())中,其中一个对象对象通过整个链并存储我需要的每个函数的所有变量。然后在该promise链的末尾,我尝试module.exports = objects.variable(在这种情况下,它是一个猫鼬模型)。但是因为在index.js中,当我变量product = require(' ./ models / products')时,它以异步方式执行此操作,因此变量product只是{}而不是等待.then promise链发生,然后使用最后写的module.exports。

有没有办法让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);

输出:

{}

1 个答案:

答案 0 :(得分:0)

  

然后在该承诺链的末尾,我尝试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);
});