JavaScript属于自己的小秘密,dotenv(Node.js库)的使用与代码的封装
前言
遇到这样的情况,我们就需要把我们的私有信息写到另一个文件中,并设置为环境变量,再在需要使用它时加载环境变量。
这种情况下,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"的文件
在里面输入以下内容
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