我怎样才能 "encapsulate" 把这段代码放到一个模块中,这样它就可以重用了?

How can I "encapsulate" this code into a module so it could become reusable?

我有这个 Node.JS 片段,想把它写成一个模块,这样我就可以在系统的不同部分使用 recaptcha。

这是目前的样子:

app.post('/register_user', (req, res) => {
  const secret_key = process.env.RECAPTCHA_SECRET;
  const token = req.body.recaptcha;
  const url = `https://www.google.com/recaptcha/api/siteverify?secret=${secret_key}&response=${token}`;
  fetch(url, { method: "post",})
    .then((response) => response.json())
    .then((google_response) => {
      if (google_response.success == true) {      
        res.format({'text/html': () => res.redirect(303, '/register'),})
      } else {
        return res.send({ response: "Failed" });
      }
    })
    .catch((error) => {
      return res.json({ error });
    });
})

我曾尝试编写以下模块,它工作得非常好,但我完全不知道如何从 app.post 调用它,因为我总是未定义为 return:

import fetch from 'node-fetch';

export function fetch_out(url, timeout = 7000) {
    return Promise.race([
        fetch(url),
        new Promise((_, reject) =>
            setTimeout(() => reject(new Error('timeout')), timeout)
        )
    ]);
}
export async function checkRecaptcha(token, secret_key){
    const url = "https://www.google.com/recaptcha/api/siteverify?secret=" + secret_key + "&response=" + token;
    try{
    const response = await fetch_out(url, 1000);
    const google_response = await response.json();
    }catch(error){
        return error;
    }
    return google_response;
}

如有任何帮助,我们将不胜感激!谢谢!

您可以通过删除需要发生的框架操作来使此方法可重用,并且仅 return 验证是否成功。这样,它就可以在另一个不使用特定框架的项目中重复使用。

示例模块;

export async function checkRecaptcha(token, secret_key) {
    const url = `https://www.google.com/recaptcha/api/siteverify?secret=${secret_key}&response=${token}`;
    
    const response = await fetch(url, { method: "post",});
    if (!response.ok) return false;

    const json = await response.json();
    if (!json.success) return false;      
    
    return true;
}

用法:

import { checkRecaptcha } from "./some-file-name";

app.post('/register_user', async (req, res) => {
    const isHuman = await checkRecaptcha(req.body.recaptcha, process.env.RECAPTCHA_SECRET);
    
    if (!isHuman) {
        return res.send({ response: "Failed" });
    }
    
    return res.format({'text/html': () => res.redirect(303, '/register'),});
});

如果你特别想在验证后调用一个动作,你也可以使用成功和错误回调。