簡體   English   中英

從文件中請求貓鼬模型,該文件在一系列promise.then.then鏈期間創建模型。

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM