node.js - 无法在NodeJS中解决: 'TypeError: Converting circular structure to JSON'

标签 node.js express axios

我已经从我们公司的一名前员工那里接管了一个内部软件工具,该工具是用 NodeJS 编写的,目前连接到一个销售团队系统。

不幸的是,我对 NodeJS 比较陌生,我目前的工作是将该工具连接到新的 shopware 6 (sw6) 系统,并将所有功能映射到新的商店系统,例如在商店系统。

我已经检查并以隔离的方式建立了与 sw6 的连接,但是我无法在 sw6 系统端到端发布工作,从内部软件工具中的工作发布表单开始到有一个商店系统中创建的工作的登陆页面。

我可能会与您分享我正在尝试调整的功能的代码:

exports.postNewJob = function(req, res) {
    var jobOffer = {
        active              : true,
        UserId              : req.user.id,
        jobId               : req.body.jobName + "-" + req.body.marketId + "-" + req.body.jobType,
        jobTitle            : jobMapper.mapJobId(req.body.jobName) + jobMapper.mapJobType(req.body.jobType),
        storeId             : req.body.marketId,
        storeLocation       : req.body.marketName,
        jobType             : req.body.jobType,
        hoursWeek           : req.body.workingHours_Week? req.body.workingHours_Week : null,
        hoursMonth          : req.body.workingHours_Month? req.body.workingHours_Month : null,
        christmasBonus      : req.body.christmasBonus? true : false,
        holidayPay          : req.body.holidayPay? true : false,
        employeeDiscount    : req.body.employeeDiscount? true: false,
        freeDrinks          : req.body.freeDrinks? true : false,
        bav                 : req.body.bav? true : false,
        vwl                 : req.body.vwl? true : false,
        vacationAmount      : req.body.vacation,
        otherBenefits       : req.body.otherBenefits,
        contactMail         : req.body.contactEmail,
        contactPartner      : req.body.contactName,
        contactMarket       : req.body.contactPlace,
        contactStreet       : req.body.contactStreet + " ",
        contactStreetNumber : req.body.contactStreetNumber,
        contactZipCode      : req.body.contactPLZ + " ",
        contactCity         : req.body.contactCity,
        countryCode         : req.body.site,
        author              : req.user.emailAdress,
        hrLink              : req.body.hrLink,
        promoted            : false,
        promotionValue      : "",
        promotionBillingAdress : req.body.premiumBillingAdress
    };
    var premium = req.body.premium;
    var premiumLimit = req.body.premiumLimit;
    var premiumBillingAdress = req.body.premiumBillingAdress;
    var jobName = req.body.jobName;

           models.JobType.findAll()
            .then(function(jobTypes) {
                models.JobPostingsMarket.findOrCreate({ where: {jobId: jobOffer.jobId}, defaults: jobOffer})
                    .then(function(jobPosting){
                        console.log("Saved new job posting with following job id: " + jobOffer.jobId);
    
                        shopwareAuth.getToken(config.CLIENT_ID_SW, config.CLIENT_PASSWORD_SW, config.SHOPWARE_INSTANCE, req.user.emailAdress, req.session, function(err, accessToken){
                            if(err) {
                                console.error("ERROR: Could not authenticate with shopware. Error: " + err);
                                res.render('app/market/jobs/form', {createError : true, jobOffer, jobName : jobName, premium : premium, premiumLimit : premiumLimit, premiumBillingAdress : premiumBillingAdress, user : req.user, jobTypes : jobTypes});
                            } else {
                                var requestBody = {
                                    'id': md5(jobOffer.jobId),
                                    'name': jobOffer.storeId + " - " + jobOffer.jobTitle,
                                    'url': jobOffer.jobId,
                                    'active': true,
                                    'salesChannels':[{'id':'XXX'}],
                                    'cmsPageId': 'XXX'
                                };
                                var headers = {
                                    'Authorization': 'Bearer ' + accessToken,
                                    'Content-Type': 'application/json',
                                };    
                                const options = {
                                    url: config.SHOPWARE_INSTANCE + '/api/landing-page/',
                                    method: 'POST',
                                    headers: headers,
                                    data: requestBody                 
                                };
    
                                console.log(options);
                                
                                axios.request(options)
                                    .then(response => {
                                        console.log("Created new Job Landing Page with ID: " + jobOffer.jobId)
                                        console.log(response.data);
                                    }) 
                                    .catch(err => {
                                        console.error('ERROR: An error occurred while sending data to shopware: ');
                                        console.error(err);
                                        res.render('app/market/jobs/form', {createError : true, jobOffer, jobName, premium, premiumLimit, premiumBillingAdress, user : req.user, jobTypes : jobTypes});
                                    })
                                    .then(() => {
            
                                        console.log({createJob : true, user : req.user, jobTypes : jobTypes});
                                        res.render('app/market/jobs/form', {createJob : true, user : req.user, jobTypes : jobTypes});         
                                    })
                                    .catch(err => {
                                        console.error(err.response.data);
                                        res.render('app/market/jobs/form', {createError : true, jobOffer, jobName, premium, premiumLimit, premiumBillingAdress, user : req.user, jobTypes : jobTypes});
                                    });
                                }
                            });
                        })
                    .catch(err=>{
                        console.error("ERROR: An error occurred while saving the new job posting to MariaDB: " + err);
                        res.render('app/market/jobs/form', {createError : true, jobOffer, jobName, premium, premiumLimit, premiumBillingAdress, user : req.user, jobTypes : jobTypes});                        
                    });
                })    
                .catch(err=>{
                    console.error("ERROR: An error occurred while loading job types on new job page.")
                    console.error(err);
                    res.redirect('/error');
                });
    }

当我尝试创建作业时,出现以下错误:

TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'ClientRequest'
    |     property 'socket' -> object with constructor 'TLSSocket'
    --- property '_httpMessage' closes the circle
    at JSON.stringify (<anonymous>)
    at hash (C:\Users\Klat\TOOL\TOOL\node_modules\express-session\index.js:594:18)
    at isSaved (C:\Users\Klat\TOOL\TOOL\node_modules\express-session\index.js:427:54)
    at shouldSave (C:\Users\Klat\TOOL\TOOL\node_modules\express-session\index.js:445:12)
    at ServerResponse.end (C:\Users\Klat\TOOL\TOOL\node_modules\express-session\index.js:330:11)
    at Gzip.onStreamEnd (C:\Users\Klat\TOOL\TOOL\node_modules\compression\index.js:212:14)
    at Gzip.emit (events.js:400:28)
    at endReadableNT (internal/streams/readable.js:1317:12)
    at processTicksAndRejections (internal/process/task_queues.js:82:21)

我已经尝试了很多东西来调试这个错误,但我很难理解问题是什么以及在什么时候引发错误。

我希望所提供的信息足以让您理解我的问题。 非常感谢!

最佳答案

幸运的是,我从这篇文章中得到了一些启发,现在能够找到问题所在:TypeError: circular structure to JSON starting at object with constructor 'ClientRequest' property 'socket' -> object with constructor 'Socket'

在请求 sw6 访问 token (shopwareAuth.getToken) 的函数中,我已经从旧的 salesforce token 请求函数改编而来,我使用了来自 OAuth2 查询响应的完整响应这是错误的,因为只需要 res.data 部分。

关于node.js - 无法在NodeJS中解决: 'TypeError: Converting circular structure to JSON' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70245061/

相关文章:

javascript - 使用 Axios 发布数据

node.js - 获取 node.js 应用程序的最大堆大小

node.js app.get 未被调用

javascript - Axios Promise 处理 - 在 react-native 中获取 "Possible Unhandled Promise Rejection - TypeError: Network request failed"

javascript - 如何根据 "schema"过滤JSON对象

node.js - 如果一次运行超过 4 个测试,Mocha 测试超时

javascript - 使用 Axios 下载图像并将其转换为 base64

node.js - 带有 Node XADD 的 Redis 流

javascript - 关于使用 mongoose 或仅使用 JS 过滤器进行过滤的问题

javascript - 服务器未发送响应