【问题标题】:How to fix 'headers already sent' error in node如何修复节点中的“标头已发送”错误
【发布时间】:2019-05-01 00:40:28
【问题描述】:

所以我正在尝试创建一个调用 ldap 服务并验证用户身份的节点应用程序。在下面的代码中,应用程序成功连接到服务器并处理了请求。但是当我尝试发回响应时,我收到了这个错误: 抛出新的 ERR_HTTP_HEADERS_SENT('set'); ^

错误 [ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置标头

我不太确定为什么会发生这种情况。我对 node、express 和 ldap 还很陌生

// ldapjs required for ldap connection
const ldap = require('ldapjs');

//express required for exposing endpoints
const express = require('express');
const app = express();

const assert = require('assert');

var client = ldap.createClient({
  url: 'ldap://someserve.com'
});

//Search filter for users in the directory
var opts = {
  filter: '(&(objectCategory=person)(objectClass=user))',
  scope: 'sub',
};

//General Ldap serch user
var UserName = '123.test.com';
var Pass = '123longpass'

//Base URL
app.get('/', (req,res) => {
    res.send('hello from node')
});

//Get all ldap users
app.get('/api/ldapUsers', (req, res) => 
{
    client.bind(UserName, Pass, function (err) 
    {
        client.search('DC=sdf,DC=sdfa,DC=gdfgd', opts, function (err, search) 
        {
            search.on('searchEntry', function (entry) 
            {
                res.setHeader('Content-Type', 'application/json');
                var users = entry.object;
                console.log(users);

                res.json(users);
                res.end(); 
            });
        });
    });

   // client.unbind( err => {
   //     assert.ifError(err);
   // });
});

const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`Listening on port ${port}...`));

【问题讨论】:

  • 您不需要调用res.end();,因为res.json(..); 在内部调用res.end。并且两次调用res.end 会导致此错误。
  • 我尝试删除 res.end() ,但仍然遇到同样的错误。好像没什么效果。
  • search.on 是一个事件监听器,所以也许尝试删除监听器? removeAllListeners('searchEntry')检查这个stackoverflow.com/questions/14459644/…

标签: node.js express ldap


【解决方案1】:

searchEntry 事件为每个找到的项目调用一次,这意味着您多次调用 res.json。

试试这个:

app.get('/api/ldapUsers', (req, res) => 
{
    client.bind(UserName, Pass, function (err) 
    {
        client.search('DC=sdf,DC=sdfa,DC=gdfgd', opts, function (err, search) 
        {
            var users = [];
            search.on('searchEntry', function (entry) {
                users.push(entry.object); 
            });
            search.on('end', function (entry) {
                res.setHeader('Content-Type', 'application/json');
                console.log(users);

                res.json(users);
                res.end(); 
            });
        });
    });
});

【讨论】:

    猜你喜欢
    • 2022-01-06
    相关资源
    最近更新 更多