【问题标题】:Sequelize model loader import doesn't work on top level import but only works on function importSequelize 模型加载器导入不适用于顶级导入,但仅适用于函数导入
【发布时间】:2020-06-06 16:29:21
【问题描述】:

这个问题不太清楚,因为错误本身并不清楚。 主要问题是可能导致空sequelize model loder的情况。

user.js

const db = require('../db/models');
async testFunc function(data){
return new Promise((resolve, reject)=>{
      try{
          let user = await db.User.findOne({where:{id:data.id}});
           resolve(user)
       }catch(error){reject(error)}
})
}
module.exports={
testFunc
}

这是定义的模块的 sn-p,它本身就可以正常工作。但是假设它在另一个模块中使用了 db 没有加载所以抛出错误 db.User is undefined

user.js

async testFunc function(data){
return new Promise((resolve, reject)=>{
      const db = require('../db/models');
      try{
          let user = await db.User.findOne({where:{id:data.id}});
           resolve(user)
       }catch(error){reject(error)}
})
}
module.exports={
testFunc
}

当前的解决方法是在每个函数中都需要模型加载器(还有其他类似的函数)。

只是提出问题以了解可能的错误并找到更好的方法。

【问题讨论】:

  • 我不完全确定,但我认为这是因为相对路径 ../db/models。如果您在另一个模块中使用该函数,您确定db/models 的相对路径与您在此处输入的相同吗?
  • 没有路径是好的,如果我使用node user.js执行带有必要参数的testFunc(params);,它也可以工作

标签: javascript node.js sequelize.js


【解决方案1】:

您的问题似乎指向了如何将模块异步导入承诺:

  1. CommonJS

导入模块的传统和最常见的方法是使用CommonJS 语法

const React = require('react');
  1. ECMA 脚本模块

第二种方式,尤其是在 React 和 Angular 生态系统中越来越受欢迎,是 EcmaScript 模块:

import { <function> } from './index.js';
  1. 动态导入

第三个是Dynamic Import,这是您在第二个示例中在执行与数据库相关的操作时动态加载模块所需要的。

这是您在第二个示例中所需要的。在进行数据库相关操作时动态加载模块

async testFunc function(data){
return new Promise((resolve, reject)=>{
      const db = require('../db/models');
      import('./db/models').then(dialogBox => {
              let user = await db.User.findOne({where:{id:data.id}});
              resolve(user)
              })
              .catch(error => {
                reject(error);
              })
           })

数据库模型的结果是一个承诺。一旦模块完全加载,Promise 就会随之实现。

【讨论】:

  • 是的,问题应该在导入的某个地方,我正在使用 CommonJs 导入,但我认为 ../db/models/index.js 的模型加载器不是异步的,尽管模型的操作是异步的。
  • 无论如何,我可以尝试异步导入。但是你将如何使用 commonJs 样式进行异步导入
  • CommonJS 在新功能方面已经过时。最好不要在你的项目中使用它github.com/joyent/node/issues/5132#issuecomment-15432598
  • 稍后会通读,但目前 nodejs 不支持没有 babel 和其他设置的 ecmaScript 导入,而且我认为我们正在偏离问题本身
  • 您必须使用节点版本
猜你喜欢
  • 2017-01-20
  • 2018-01-23
  • 2012-06-26
  • 2017-01-12
  • 2015-11-26
  • 2022-01-16
  • 2017-05-23
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多