gpt4 book ai didi

javascript - 变量未返回所需的对象

转载 作者:行者123 更新时间:2023-12-03 08:54:56 24 4
gpt4 key购买 nike

我正在构建一个 Express 应用程序。我当前在以下文件中出现错误 factoryRepository.js

let appReference = null;

module.exports.init = (app) => {
appReference = app;
};

module.exports.getRepositoryFactory = () => {

let repositoryFactory = {

getUserRepository: () => {
return require("./UserRepository").init(appReference.get('models').User);
}

};

return repositoryFactory;
};

appReference.get抛出 TypeError 因为 appReference仍然是null即使在我调用module.exports.init之后别的地方。

我尝试创建一个返回 appReference 的函数这样我就可以看到它处于什么状态。我已经能够得到 app而不是null ,仅在 getUserRepository 的上下文中它保留null .

只有当我ping某个路由时才会调用故障线路。

编辑:

这是app.js ,来自 module.exports.init 的上下文正在被调用

import express from 'express';
import passport from 'passport';
import config from './config/config';

let app = express();

// Setup models
app.set('models', require('./app/models'));
require('./app/repo/repositoryFactory').init(app);
// Setup config
require('./config/init')(app);
// Setup routes
require('./app/routes')(app, passport);
// Setup passport
require('./app/auth')(passport, config);
// Route to ends
require('./config/endpoints')(app);

export default app;

public.js是给我的路由器的逻辑,在这里我用 repositoryFactory.getUserRepository() 调用错误代码。

let repositoryFactory = require('../repo/RepositoryFactory').getRepositoryFactory();

module.exports.doLogin = (req, res) => {
let success = () => {
res.redirect('/');
};

let error = (message) => {
res.status(500).json(message);
};

let userRepository = repositoryFactory.getUserRepository();
userRepository.findOrCreate({
facebookId: req.user.id,
displayName: req.user.displayName
}, success, error);
};

module.exports.doLogout = (req, res) => {
req.logout();
res.json({
success: true,
message: 'You\'ve succesfully logged out.'
});
};

最佳答案

这看起来像是一个范围问题。假设我们按如下方式简化了您的三个文件,并将它们全部放在同一目录中(为了简单起见):

app.js:

'use strict';
const express = require('express');

let app = express();

require('./repositoryFactory').init(app);

const myPublic = require('./public');

repositoryFactory.js:

'use strict';
let appReference = null;

module.exports.init = (app) => {
appReference = app;
};

module.exports.getRepositoryFactory = () => {
return appReference ? 'I have an app reference!' : 'No app reference!';
};

public.js:

'use strict';
let repositoryFactory = require('./RepositoryFactory').getRepositoryFactory();

console.log(repositoryFactory);

这将记录没有应用程序引用!,因为repositoryFactory不是单例。 app.js 中的 repositoryFactory 实例与 public.js 中的 repositoryFactory 实例不同。

一种解决方案是为 repositoryFactory 实例传递一个参数。 repositoryFactory.js 将保持不变,但 app.js 可能如下所示:

'use strict';
const express = require('express');

let app = express();

const repositoryFactory = require('./repositoryFactory')
repositoryFactory.init(app);

const myPublic = require('./public');
myPublic.init(repositoryFactory);
myPublic.log();

相应的 public.js 可能如下所示:

'use strict';
let repositoryFactory = null;

module.exports.init = (myRepositoryFactory) => {
repositoryFactory = myRepositoryFactory.getRepositoryFactory();
}

module.exports.log = () => {
console.log(repositoryFactory);
}

关于javascript - 变量未返回所需的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32543696/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com