You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DigitalOcean无服务器函数中NodeJS输出HTML失败求助

解决DigitalOcean无服务器函数输出HTML的问题

你的核心问题是没搞懂DigitalOcean无服务器函数的响应机制——它不是传统Node.js HTTP服务器,不需要用res.setHeader或res.end,而是通过返回一个包含headers和body的对象来输出内容,这也是官方示例的核心逻辑。

错误原因

你代码里的res完全没定义,因为DO函数不会传入原生HTTP的res对象,直接调用肯定报错。另外你用了立即执行的async函数,但没正确处理返回值,导致函数默认返回undefined,自然无法输出任何内容到响应里。

修改后的可用代码

const metascraper = require('metascraper')([
  require('metascraper-title')()
])
const got = require('got');

exports.main = async (args) => {
  const targetUrl = "https://facebook.com";
  
  try {
    const { body: html, url } = await got(targetUrl);
    const metadata = await metascraper({ html, url });
    
    // 输出HTML内容(可自定义结构)
    return {
      headers: { 'content-type': 'text/html; charset=UTF-8' },
      body: `<h1>Print test</h1><p>抓取到的页面标题:${metadata.title}</p>`
    };

    // 如果需要输出JSON,替换成下面的返回逻辑
    // return {
    //   headers: { 'content-type': 'application/json; charset=utf-8' },
    //   body: JSON.stringify(metadata)
    // };
  } catch (err) {
    // 统一处理错误,返回错误提示页面
    return {
      headers: { 'content-type': 'text/html; charset=UTF-8' },
      statusCode: 500,
      body: `<h1>请求出错</h1><p>${err.message}</p>`
    };
  }
}

关键注意点

  1. 将main声明为async函数:因为代码里用了await处理异步请求,必须让函数本身是异步的,才能正确返回异步操作后的结果。
  2. 返回标准响应对象:这个对象必须包含headers(指定内容类型,比如HTML或JSON)和body(要输出的内容字符串),DO平台会自动把这个对象转换成HTTP响应返回给请求方。
  3. 完善错误捕获:用try/catch包裹所有异步逻辑,避免出现未处理的Promise拒绝,同时给用户返回明确的错误提示。

你之前尝试官方的.then写法无效,大概率是因为没有正确返回那个包含headers和body的响应对象,或者异步逻辑的嵌套位置不对。用async/await的写法更直观,也更容易调试。

内容的提问来源于stack exchange,提问作者ewfewfjio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 06:54:46