likes
comments
collection
share

JavaScript属于自己的小秘密,dotenv(Node.js库)的使用与代码的封装

作者站长头像
站长
· 阅读数 20

前言

遇到这样的情况,我们就需要把我们的私有信息写到另一个文件中,并设置为环境变量,再在需要使用它时加载环境变量。

这种情况下,Node.js中的dotenv库能够帮助我们解决这个问题。

正文

如何使用dotenv库呢?,接下来我来告诉你:我们以调用openai接口的代码为例

首先我们先下载openai的库: 使用

npm i openai

能够允许我们调用openai的库 接着我们编写一个简单的调用实例:

const OpenAI = require('openai')


const client = new OpenAI({
  apiKey:'',
  baseURL:'https://api.chatanywhere.tech/v1'
})

    const chatCompletion = await client.chat.completions.create({
        messages: [{role: 'user', content: prompt}],
        model: model,
    }

async function main(){
    
    let text =`
    您应该提供尽可能清晰、具体的指示,以表达您希望模型执行的任务\
    这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。\
    不要将写清晰的提示词与写简短的提示词混淆。\
    在许多情况下,更长的提示词可以为模型提供更多的清晰度和上下文信息,\
    从而拿到更详细的相关输出
    `
    
    let prompt = `
    把三个反引号括起来的文本总结成一句话,20字以内
    \`\`\`${text}\`\`\`
    `

    
    console.log(chatCompletionchoices[0].message.content);

    
}
main()

这个代码能够正常运行并输出。

接下来我们新建一个名为".env"的文件

JavaScript属于自己的小秘密,dotenv(Node.js库)的使用与代码的封装

在里面输入以下内容

OPENAI_API_KEY=xxxxxxxxxxxxxxxxxxxx//输入你自己拿到的API

当然了,在实际开发过程中,你还有很多别的信息需要进行私有化:

例如数据库的用户名和密码:

MYSQL_USER=root
MYSQL_PASSWORD=xxxxxxxx//mysql密码

我们如何在代码中使用它呢?

直接在代码中输入

require('dotenv').config();

这样就引入了环境变量

接着我们再在apiKey处换成

apiKey: process.env.OPENAI_API_KEY,

process为node中的全局对象

我们还可以将代码优化一下,将调用大模型的模块进行封装

const getChatCompletion = async (model,prompt) => {
    const chatCompletion = await client.chat.completions.create({
        messages: [{role: 'user', content: prompt}],
        model: model,//适合聊天的模型 很多种
    });
    return chatCompletion.choices[0].message.content
}

然后在主函数调用这个geiChatCompletion函数就能传入信息并获得大模型给出的数据,一定程度上使得我们的代码更加便于维护

完整代码如下:


const OpenAI = require('openai')
require('dotenv').config();


const client = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
  baseURL:'https://api.chatanywhere.tech/v1'
})

const getChatCompletion = async (model,prompt) => {
    const chatCompletion = await client.chat.completions.create({
        messages: [{role: 'user', content: prompt}],
        model: model,
    });
    return chatCompletion.choices[0].message.content
}

async function main(){
   
    let text =`
    您应该提供尽可能清晰、具体的指示,以表达您希望模型执行的任务\
    这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。\
    不要将写清晰的提示词与写简短的提示词混淆。\
    在许多情况下,更长的提示词可以为模型提供更多的清晰度和上下文信息,\
    从而拿到更详细的相关输出
    `
    
    let prompt = `
    把三个反引号括起来的文本总结成一句话,20字以内,输出英文
    \`\`\`${text}\`\`\`
    `

    const chatCompletion = await getChatCompletion('gpt-3.5-turbo',prompt2)
    console.log(chatCompletion);

   
}
main()

总结

封装

封装鼓励将相关功能组织在一起,形成独立的模块或组件。这样,当需要在其他地方实现类似功能时,可以直接复用这些模块,而不是重复编写相同的代码。这不仅减少了代码量,也降低了出错的可能性,提高了开发效率。 通过封装,代码的内部实现细节被隐藏起来,外界仅通过定义良好的接口(如函数签名、类的公共方法)与之交互。这意味着,当需要修改或优化内部逻辑时,不会影响到使用该模块的其他部分,降低了修改引起连锁反应的风险,使得维护工作更加集中和高效。 在封装的过程中,通常会对代码进行抽象和优化,使得逻辑更清晰,结构更合理。此外,良好的封装还能促使开发者编写单元测试,确保每个模块的行为符合预期,从而整体提升代码的质量和稳定性。

安全

通过将敏感环境变量存储在.env文件中,而不是直接硬编码在源代码里,dotenv显著提升了应用的安全性。这样可以避免因源代码泄露而造成的敏感信息暴露风险,同时方便了在不同环境中(如开发、测试、生产)使用不同的配置 它提供了一种统一且简便的方式来管理环境变量,使得开发者可以轻松地更改配置,而无需在代码中进行硬编码的修改。这有利于保持代码的整洁,也便于团队成员之间的协作。 dotenv支持根据不同的环境加载不同的.env文件,如.env.development.env.test.env.production,有助于实现环境之间的隔离,确保开发环境的配置不会意外地影响到生产环境。

搞定!有问题欢迎私信评论。

求点赞收藏,谢谢!

转载自:https://juejin.cn/post/7371423076662509608
评论
请登录